Java线程之join_动力节点Java学院整理
Java中的join()方法是一个非常基本且重要的线程方法。它可以使一个线程等待另一个线程完成后再继续执行。
我们知道在Java程序中,多个线程可以同时执行,但是有时候我们希望某个线程执行完之后再执行其他的线程。join()方法就是达到这个目的的一种方式。在调用某个线程的join()方法时,当前线程将会被挂起,直到该线程执行完成。
语法:
public final void join()throws InterruptedException
调用该方法会使当前线程阻塞,直到该线程执行完成,或者其他的线程中断它。
join()方法有三种重载形式:
public final void join(long millis) throws InterruptedException;
public final synchronized void join(long millis,int nanos) throws InterruptedException;
public final synchronized void join() throws InterruptedException;
个重载方法,指定了等待时间,在规定的时间内,如果该线程没有执行完,则当前线程会继续执行。如果在等待的时间内线程已经执行完,则当前线程会立即继续执行。
第二个重载方法,除了等待的时间之外,还可以指定等待的时间的纳秒数。
第三个重载方法,没有指定等待时间,只是让当前线程阻塞直到该线程执行完成。
示例:
public class JoinTest {
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(new MyRunnable(), "Thread-1");
Thread t2 = new Thread(new MyRunnable(), "Thread-2");
t1.start();
System.out.println("开启线程1");
t2.start();
System.out.println("开启线程2");
// 等待t1和t2执行完
t1.join();
t2.join();
System.out.println("所有线程执行完毕");
}
static class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " 执行中...");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " 执行完毕");
}
}
}
输出:
开启线程1
开启线程2
Thread-1 执行中...
Thread-2 执行中...
Thread-1 执行完毕
Thread-2 执行完毕
所有线程执行完毕
从输出结果可以看出,在一开始开启两个线程之后,主线程调用了t1.join()和t2.join()方法,使其等待t1和t2执行完毕。最后,等待时间过后,所有线程都执行完毕,主线程才会继续执行。
总结:
join()方法是一个非常重要的线程方法,可以在多线程编程中实现线程之间的控制和协调。通过该方法可以使一个线程等待另一个线程执行完成后再继续执行。在使用join()方法时,需要注意线程的同步问题,以免出现死锁和其他问题。
