多线程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循环的下一轮循环(开启第二个新线程)啊