Java多线程初学者指南(5):join方法的使用

 在上面的例子中多次使用到了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

原文地址:https://www.cnblogs.com/dragonflyyi/p/3538488.html