thread.join()的作用是让当前线程等待线程thread终止。当前线程在join的过程中,如果被interrupt了,则join()方法抛出InterruptedException。
当调用join()方法,当前线程进入无限期的阻塞,join所属的线程正常执行它的target上的任务,等其销毁后,当前线程继续往后执行。
join具有使线程排队运行的作用,有些类似于同步运行的效果。join和synchronized的区别是:join在内部使用wait方法进行等待,而synchronized关键字使用的是"对象监视器"原理进行同步。
join(long)可以设置至多等待多长时间。
join的实现如下,它调用了join(0):
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;
可以看到,join的内部调用的是wait方法,所以它会释放锁。这样,其他线程就可以调用此线程中的同步方法。
thread.join()的作用是让当前线程等待线程thread终止。当前线程在join的过程中,如果被interrupt了,则join()方法抛出InterruptedException。当调用join()方法,当前线程进入无限期的阻塞,join所属的线程正常执行它的target上的任务,等其销毁后,当前线程继续往后执行。join具有使线程排队运行的作用,有些类似于同步运行的效果。joi...
Join作用
join是定义在Thread类中的方法,作用是阻塞当前线程的执行,等到被调用join的线程对象执行完毕才执行继续执行当前线程。在Java源码中的定义如下:
public final void join() throws InterruptedException {
join(0);
public final synchronized void join(long millis) throws InterruptedException
接下来我们先来看看join的简单使用,这样能
一、Thread的join方法。
join()的使用场景
在很多情况下,主线程创建并启动子线程,如果子线程中要进行大量的耗时运算,主线程将可能早于子线程结束。如果主线程需要知道子线程的执行结果时,就需要等待子线程执行结束了。主线程可以sleep(xx),但这样的xx时间不好确定,因为子线程的执行时间不确定,join()方法比较合适这个场景。
单核cpu运行多线程时底层实现原理是多个线程间切换,由于cpu的处理速度很快,看上去像多个线程同时运行。那么我们如何实现让线程T1,T2,T3,在T1执行完成后才执行T2,T2执行完成后才执行T3,也就是线程的串行化,通过Thread类的join方法就可以实现。
join方法:将该线程加入当前线程,当前线程等待加入线程执行完成才继续执行。
public class Threa
public class Main {
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(new MyThread(), "t1");
Thread t2 = new Thread(new MyThread(), "t2");
t1.start();
t1.join();
t2.start();
t2.join();
System.out.println("主线程完成");
class MyThread implements Runnable {
@Override
public void run() {
System.out.println("线程" + Thread.currentThread().getName() + "开始运行");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
System.out.println("线程" + Thread.currentThread().getName() + "运行结束");
输出结果:
线程t1开始运行
线程t1运行结束
线程t2开始运行
线程t2运行结束
主线程完成
这段代码创建了两个线程(t1 和 t2),并在主线程的末尾调用了 `t1.join()` 和 `t2.join()` 方法,表示主线程等待 t1 和 t2 两个线程完成后再继续执行。因此,程序输出结果显示了 t1 和 t2 两个线程依次完成后,主线程才结束。