Java中的线程提供了一个方法:Thread.join(),从单词上可以看出,是加入的意思。含义就是:如果在线程A的内部调用了线程B的join()方法,需要等到线程B执行完毕,才能继续执行!线程Thread除了提供join()方法外,还提供了join(long millis),join(long millis, int nanos)两个具备超时特性的方法。这两个超时方法,如果线程在给定的时间内没有终止,将会从该超时方法中返回。
从源码中可以看出join()方法是由关键字synchronized修饰的,是线程安全的,并且底层还是调用wait()方法来实现的。下面通例子来说明join()方法的含义:
public class TwoThreadJoin {
public static void main(String[] args) {
final Thread t1 = new Thread(new Runnable() {
public void run() {
try {
System.out.println("线程"+Thread.currentThread().getName()+"执行。。。");
TimeUnit.SECONDS.sleep(3);
System.out.println("线程"+Thread.currentThread().getName()+"结束。。。");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, "t1");
final Thread t2 = new Thread(new Runnable() {
public void run() {
try {
t1.join();
System.out.println("线程"+Thread.currentThread().getName()+"执行。。。");
TimeUnit.SECONDS.sleep(1);
System.out.println("线程"+Thread.currentThread().getName()+"结束。。。");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, "t2");
t2.start();
t1.start();
}
}
两个线程t1和t2,t2中调用了t1.join()方法,就会等着t1执行完,t2才会执行!结果如下:
如果把t1.join()给注释掉,就不会按照顺序来执行了!
假设给定一个超时时间t1.join(2000),在2000毫秒之内,t1肯定执行不完,因为t1休眠了3000毫秒,这时就会从t1返回,t2继续执行!