在上面的例子中多次使用到了Thread类的join方法。我想大家可能已经猜出来join方法的功能是什么了。对,join方法的功能就是使异步执行的线程变成同步执行。也就是说,当调用线程实例的start方法后,这个方法会立即返回,如果在调用start方法后后需要使用一个由这个线程计算得到的值,就必须使用join方法。如果不使用join方法,就不能保证当执行到start方法后面的某条语句时,这个线程一定会执行完。而使用join方法后,直到这个线程退出,程序才会往下执行。下面的代码演示了join的用法
1 package com.fly.join; 2 3 public class JoinThread extends Thread { 4 public static int n = 0; 5 6 static synchronized void inc() { 7 n++; 8 } 9 10 public void run() { 11 for (int i = 0; i < 10; i++) 12 try { 13 inc(); 14 sleep(3); // 为了使运行结果更随机,延迟3毫秒 15 16 } catch (Exception e) { 17 } 18 } 19 20 public static void main(String[] args) throws Exception { 21 22 Thread threads[] = new Thread[100]; 23 for (int i = 0; i < threads.length; i++) 24 // 建立100个线程 25 threads[i] = new JoinThread(); 26 for (int i = 0; i < threads.length; i++) 27 // 运行刚才建立的100个线程 28 threads[i].start(); 29 30 System.out.println("args.length="+args.length); 31 if (args.length > 0) 32 for (int i = 0; i < threads.length; i++) 33 // 100个线程都执行完后继续 34 threads[i].join(); 35 System.out.println("n=" + JoinThread.n); 36 } 37 38 }
建立了100个线程,每个线程使静态变量n增加10。如果在这100个线程都执行完后输出n,这个n值应该是1000。
测试1: 上面运行的结果为不确定值,但是一般不等于1000。 因为并不是所有线程都运行完了,才执行最后的打印“n=" +JoinThread.n
测试2: 将31行代码修改为:args.length >= 0, 则结果输出一定为:1000. 即所有线程都执行完了才执行最后的打印“n=" +JoinThread.n