マルチスレッドjoinの使い方

2186 ワード

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を作成させます.
これで整然とした.