java中join()方法的等价写法分析

本文详细解析了Java中线程join方法的工作原理,通过源码分析解释了如何通过join方法确保主线程等待子线程完成。同时介绍了join方法内部如何利用wait与notifyAll机制实现线程间的同步。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

join()的用法:join()方法是调用者轮询来查看该线程的alive状态,调用者使用 t1.join()来等待t1线程结束。

join()源码

	public final synchronized void join(long millis) throws InterruptedException {
        long base = System.currentTimeMillis();
        long now = 0;

        if (millis < 0) {
            throw new IllegalArgumentException("timeout value is negative");
        }
        if (millis == 0) {
            while (isAlive()) {
                wait(0);
            }
        } else {
            while (isAlive()) {
                long delay = millis - now;
                if (delay <= 0) {
                    break;
                }
                wait(delay);
                now = System.currentTimeMillis() - base;
            }
        }
    }

t1.join()的等价写法:

synchronized (t1) {
	// 调用者线程进入 t1 的 waitSet 等待, 直到 t1 运行结束
	while (t1.isAlive()) {
	t1.wait(0);
 }
}

完整的代码

public static void main(String[] args) throws Exception {
		Thread t1 = new Thread(() -> {
			System.out.println("t1先执行");
		}, "t1");

		Thread t2 = new Thread(() -> {
			try {
				synchronized (t1) {
				// 调用者线程进入 t1 的 waitSet 等待, 直到 t1 运行结束
					while (t1.isAlive()) {
						t1.wait(0);
					}
				}
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("t2后执行");
		}, "t2");
		t1.start();
		t2.start();
	}

打印:

t1先执行
t2后执行

刚开始的时候我是很懵逼的,因为可以发现,t1.wait(0)后【把t1直接看成一个普通对象,此时t2线程释放对象锁进入WAITING状态】,并没有相应的notifyAll()/notify()方法来将t2线程唤醒,那为什么能够打印"t2后执行"呢?

这里的一个重大知识点是,t1.wait()后是如何唤醒线程的?

通过看join()的文档:

As a thread terminates the {@code this.notifyAll} method is invoked。 当一个线程终止时,notifyAll方法会被调用。

所以,当t1线程终止时,会隐式地调用t1.notifyAll()方法,从而唤醒了t2线程,让t2的代码继续执行。

<think>好的,我现在需要回答用户关于Java SDK 1.8新特性的问题。首先,我需要回忆Java 8的主要更新,同时结合提供的引用内容来确保准确性和相关性。 用户提到引用[4]中有关JDK1.8的新特性,包括接口的默认方法和静态方法、并行流等。我应该先整理这些内容,同时补充其他重要特性,比如Lambda表达式、方法引用、Stream API、新的日期时间API等。需要确认这些特性是否符合引用中的信息,避免引入不相关的内容。 另外,引用[1]和[2]涉及到Java 8在IDEA中的配置和Android开发中的应用,但用户主要问的是新功能,可能不需要深入这部分,但可以提到对Android的支持,如引用[2]提到的脱糖支持,说明Java 8特性在Android中的兼容性。 接下来,我需要分点组织这些特性,确保每个特性都有简明扼要的解释,并适当举例。例如,Lambda表达式可以简化代码,并行流提升性能,日期时间API解决旧的Date类的缺陷。同时,注意引用[4]提到的默认方法和静态方法在接口中的使用,以及类优先原则。 还要检查是否有其他重要特性被遗漏,比如Optional类、Nashorn JavaScript引擎等,确保覆盖全面的同时不过于冗长。最后,生成相关问题时要围绕这些特性,可能涉及应用场景、性能影响、具体使用示例等。 需要确保使用正确的中文术语,避免直译英文术语导致理解困难。同时,按照用户要求,数学公式用$...$,独立公式用$$...$$,但Java特性可能较少涉及数学公式,所以可能这部分用得少,但如果有比如流处理的例子,可以适当展示。 最后,引用需要正确标注,比如在默认方法部分引用[4],在Android支持部分引用[2]。确保每个引用标记自然出现在相关段落的末尾。</think>### Java SDK 1.8 新特性与改进 Java 8(JDK 1.8)是Java语言的重要版本更新,引入了项革命性特性,提升了开发效率和性能。以下是核心改进: --- #### 1. **Lambda表达式** - **作用**:简化匿名内部类的写法,支持函数式编程。 - **示例**: ```java List<Integer> list = Arrays.asList(1, 2, 3); list.forEach(n -> System.out.println(n)); ``` - **意义**:使代码更简洁,便于并行操作。 --- #### 2. **接口的默认方法与静态方法** - **默认方法(Default Method)** 允许接口包含已实现的默认方法,避免破坏现有实现类[^4]。 ```java interface Vehicle { default void print() { System.out.println("默认方法"); } } ``` - **静态方法** 接口可直接通过名称调用静态方法,例如`Comparator.comparing()`。 --- #### 3. **函数式接口与`java.util.function`包** - **定义**:仅含一个抽象方法的接口(如`Runnable`、`Consumer`),可用`@FunctionalInterface`注解标记。 - **常见函数式接口**: - `Predicate<T>`:断言型函数 - `Function<T,R>`:输入T返回R - `Supplier<T>`:无参返回T --- #### 4. **Stream API** - **作用**:通过声明式语法处理集合数据,支持并行流(`parallelStream()`)提升性能[^4]。 - **示例**: ```java List<String> filtered = list.stream() .filter(s -> s.startsWith("A")) .collect(Collectors.toList()); ``` --- #### 5. **新的日期时间API(JSR 310)** - **改进**:修复`java.util.Date`的线程安全问题,引入不可变类如`LocalDate`、`LocalTime`。 - **示例**: ```java LocalDateTime now = LocalDateTime.now(); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); String formattedDate = now.format(formatter); ``` --- #### 6. **Optional类** - **目的**:减少空指针异常,显式处理可能为`null`的值。 - **用法**: ```java Optional<String> optional = Optional.ofNullable(str); optional.ifPresent(System.out::println); ``` --- #### 7. **方法引用** - **语法**:简化Lambda表达式,例如`System.out::println`等价于`x -> System.out.println(x)`。 - **类型**: - 静态方法引用:`ClassName::method` - 实例方法引用:`instance::method` --- #### 8. **并行处理与性能优化** - **并行流**:通过`parallel()`将操作并行化,适用于大数据集处理。 - **底层改进**:Fork/Join框架优化,提升核CPU利用率。 --- #### 9. **其他改进** - **Nashorn JavaScript引擎**:替代Rhino引擎,支持更快的JavaScript执行。 - **类型注解**:允许在变量、参数等位置使用注解(需配合工具分析)。 - **Android兼容性**:Android Gradle插件4.0+支持Java 8特性脱糖(反向编译兼容)[^2]。 --- ### 应用场景 - **Lambda与Stream**:简化集合操作,如过滤、映射、聚合。 - **默认方法**:扩展接口功能时保持向下兼容[^4]。 - **日期时间API**:需高精度时间管理的系统(如金融交易)。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值