多线程join如何用
多线程join怎么用
join,说白了就是让本来异步执行的多线程变成同步执行的。
这么说比较抽象,不太好理解,我们举个例子如下:
package mythread; public class JoinThread extends Thread { public static int n = 0; static synchronized void inc() { n++; System.out.println("当前活动线程和N分别为:"+Thread.currentThread().getName()+"_"+n); } public void run() { for (int i = 0; i < 10; i++) try { inc(); sleep(3); // 为了使运行结果更随机,延迟3毫秒 } catch (Exception e) { } } public static void main(String[] args) throws Exception { Thread threads[] = new Thread[100]; for (int i = 0; i < threads.length; i++) // 建立100个线程 threads[i] = new JoinThread(); for (int i = 0; i < threads.length; i++){// 运行刚才建立的100个线程 threads[i].start(); System.out.println("线程"+i+"start了"); threads[i].join();//关键点 } System.out.println("n=" + JoinThread.n); } }
这段代码,放在eclipse中运行一下,看看就会发现其中的端倪了。
在代码中,我作了个标记“关键点”。
大家可以分别将这句话注释和打开时,发现n输入的值是不一样的。
如果不用join(),那么n打出来每次都不一样,有可能是300,有可能是180,反正不可能是1000。
而加入Join后必然是1000。
那么这是为什么呢?
原来大家要知道线程与线程是竞争的关系,当main函数创建了一个第一个线程后,它就开始和main所在的线程进行竞争(即抢占对CPU的控制权)。谁也不服输。
如果线程1竞争成功,那么他就是去将n++,他想去循环10遍,可是main不会让它这么轻松,通过观察此程序运行结果就可以看出,线程1的10次是被分散了很多次才完成的,毕竟当线程创建越多,线程1的竞争能力就越差。
如果是main竞争成功,那么他就会去创建线程2,线程2创建成功后,又同时与线程1和main竞争。
这样当main创建完第100个线程后,此时100个线程正在打架,谁了不服谁。每个线程的10次都没有全部完成。
此时,如果我们强行打印出N的值,肯定是远远小于1000的。
而如果我们刚创建完一个线程就让它Join后,那么就相当于有警察在旁边执勤了。
main线程不准抢线程1的CPU控制权,等线程1运行结束后,再让main创建线程2。
这样就有条不紊了。
1 楼
wzt7576
2012-06-04
线程1的10次是被分散了很多次才完成的,
你说的这种情况不可能出现吧,当第一个新线程启动后,join后(加入了主线程),主线程必须等他执行完才能执行for循环的下一轮循环(开启第二个新线程)啊
你说的这种情况不可能出现吧,当第一个新线程启动后,join后(加入了主线程),主线程必须等他执行完才能执行for循环的下一轮循环(开启第二个新线程)啊