加入一个线程:join
在启动一个线程之后调用该线程的join()方法,会使该线程先执行,该线程执行完成后,再执行调用该线程的线程。
例如如下的任务:
public class LiftOff extends Thread { public LiftOff(){ taskCount++;// 计数自增 } private int countDown = 3; // 倒计时数字 private static int taskCount = 0; private int id = taskCount; @Override public void run() { while (countDown >= 0) { System.out.println("线程编号" + id + "--倒计时" + countDown); countDown--; if (countDown < 0) { System.out.println(Thread.currentThread() + ":" + id); } } } }
驱动该任务:
public class Launch { public static void main(String[] args) { Thread t0 = new Thread(new LiftOff()); Thread t1 = new Thread(new LiftOff()); Thread t2 = new Thread(new LiftOff()); t0.start(); t1.start(); try { t1.join(); } catch (InterruptedException e) { e.printStackTrace(); } t2.start(); } }
程序中利用三个Thread驱动任务,其中t1调用join()方法,输出:
线程编号0--倒计时3 线程编号1--倒计时3 线程编号1--倒计时2 线程编号1--倒计时1 线程编号1--倒计时0 线程编号0--倒计时2 Thread[Thread-3,5,main]:1 线程编号0--倒计时1 线程编号0--倒计时0 Thread[Thread-1,5,main]:0 线程编号2--倒计时3 线程编号2--倒计时2 线程编号2--倒计时1 线程编号2--倒计时0 Thread[Thread-5,5,main]:2
“线程编号2”的输出总是在t1完全执行完后,也可以在join()中加上超时参数,如果目标线程在该时间到期时还没有结束的话,join()方法也能返回:
public class Launch { public static void main(String[] args) { Thread t0 = new Thread(new LiftOff()); Thread t1 = new Thread(new LiftOff()); Thread t2 = new Thread(new LiftOff()); t0.start(); t1.start(); try { t1.join(1); } catch (InterruptedException e) { e.printStackTrace(); } t2.start(); } }
输出:
线程编号0--倒计时3 线程编号1--倒计时3 线程编号1--倒计时2 线程编号1--倒计时1 线程编号1--倒计时0 Thread[Thread-3,5,main]:1 线程编号2--倒计时3 线程编号2--倒计时2 线程编号2--倒计时1 线程编号2--倒计时0 Thread[Thread-5,5,main]:2 线程编号0--倒计时2 线程编号0--倒计时1 线程编号0--倒计时0 Thread[Thread-1,5,main]:0