下面我来详细讲解Java中Thread.join()的使用方法。
Thread.join()方法
Thread.join()方法是一个用于等待线程结束的方法。在执行线程时,可以调用join()方法,让当前线程等待被调用join()方法的线程执行完成后才继续往下执行。
语法
public final void join() throws InterruptedException
public final synchronized void join(long millis) throws InterruptedException
join()方法有两种重载形式,其中第一种线程一直等待,直到被等待线程执行完成;而第二种则是在线程等待一定时间后,若等待完指定的时间而被等待线程依然没有执行完,则当前线程不再等待。
示例一
下面是一个使用Thread.join()方法的简单示例:
public class JoinDemo {
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(() -> {
System.out.println("线程1开始执行");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程1执行完成");
});
Thread t2 = new Thread(() -> {
System.out.println("线程2开始执行");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程2执行完成");
});
t1.start();
t2.start();
// 等待t1和t2执行完成后再往下执行
t1.join();
t2.join();
System.out.println("主线程执行完成");
}
}
上面的代码中,首先创建了两个线程t1和t2,并在主线程中启动它们。接着在主线程中分别调用了t1.join()和t2.join()方法,这意味着主线程会等待t1和t2执行完成后再执行。
运行上面的代码,可以看到输出结果如下:
线程1开始执行
线程2开始执行
线程1执行完成
线程2执行完成
主线程执行完成
可以看到,当t1和t2执行完成后,主线程才会继续执行下去。
示例二
再来看一个稍微复杂一点的示例:
public class JoinDemo2 {
public static volatile int count = 0;
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(() -> {
synchronized (JoinDemo2.class) {
for (int i = 0; i < 1000000; i++) {
count++;
}
}
});
Thread t2 = new Thread(() -> {
synchronized (JoinDemo2.class) {
for (int i = 0; i < 1000000; i++) {
count++;
}
}
});
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println("count = " + count);
}
}
上面的代码中,创建了两个线程t1和t2,它们都会执行一个类变量count的自增操作。由于count是static的,因此要使用JoinDemo2.class作为synchronized锁对象,避免多线程访问异常。
在主线程中启动t1和t2,然后分别调用它们的join()方法,用于等待它们执行完成后再打印count的值。
运行上面的代码,可以看到输出结果如下:
count = 2000000
可以看到,由于使用了Thread.join()方法,确保了t1和t2线程执行完成后,主线程才打印了count的最终值 2000000。
总结
通过上面的两个示例,大家应该已经掌握了Thread.join()方法的使用方法,以及它的作用。当需要等待某个线程执行完成后再继续执行的时候,可以使用join()方法。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java中Thread.join()的使用方法 - Python技术站