スレッド同期のJavaのマルチスレッドよりエレガントな実装:交互に印刷するA、B LockSupport達成

問題の概要

我々は通常の同期方法は、待機スレッドがウェイクアップ機構を、ウェイクアップ機構を待っては継承の独占的な使用に基づいている間に使用することで実現するスレッドやプロセスの同期と相互排他の関係の2種類があります。しかし、同時スレッドは、必ずしも相互に排他的で達成することはありませ。例えば、スレッドは、印刷スレッドBを印刷します これらの二つのスレッドがない排他的な関係はありませんが、このような要求からなる:代替印刷Aを、B. 私たちの一般的な解決策は、()/メカニズムを通知待機を使用することがしばしばあります。

 

 

二LockSupportはじめに

ツールクラス、その主な学習方法としてLockSupport。

公園():内部スレッドの呼び出しでは、ブロックされるまで、現在のスレッドの自己示すライセンスを

公園(スレッド変数):ライセンスを取得するために指定したスレッドをしてみましょう。

これらの2つの方法の定義を見て、それはこれらの2つの方法がコールを達成するために使用することができます明らかである(同期)シーケンシャルスレッド

 

三〇から二種類を印刷するための方法は、交互にA / Bであります

ウェイクアップ機構を待ちます。

/ ** 
 * @program:試験
 *の@description:交替打印A / B等待唤醒机制
 * @author:
 * @Create:2019年7月22日14時28分
 * / 
publicクラスTest3は{ 
   静的クラスMyRunが実行可能{実装
        静的INTをI = 0; 
        @Override 
        公共同期ボイドラン(){ 
            (INT J = 0であり、j <10; J ++)用{ 
                IF(I%2 == 0)
                    のSystem.out.println(にThread.currentThread()のgetName()+ ": A "); 
                    のSystem.out.println(にThread.currentThread()のgetName()+ ":B"); 
                I ++; 
                this.notifyAll(); 
                {試します
                    IF(I> = 19)
                        Thread.sleep(10)。
                        this.wait(); 
                }キャッチ(InterruptedExceptionある電子){ 
                    e.printStackTrace(); 
                } 
            } 
        } 
    } 

    パブリック静的無効メイン(文字列[] args){ 
        MyRun myRun =新しいMyRun()。
        =新しいスレッド(myRunを)スレッド。
        スレッドB =新しいスレッド(myRun)。
        a.start(); 
        b.start(); 
    } 
}

  

達成LockSupport

/ ** 
 * @program:試験
 *の@description:交替打印A、B LockSupport实现
 * @author:
 * @Create:2019年7月22日14:03 
 * / 
publicクラスTest2を{ 
     静的スレッドA = NULL; 
    静的スレッドB = NULL; 
    パブリック静的無効メイン(文字列[] args){ 
        A =新しいスレッド(新しいRunnableを(){ 
            @Override 
            公共ボイドラン(){ 

                (INTのためにI = 0; I ++){; iが10 < 
                    LockSupport.park(); 
                    システム.out.println(にThread.currentThread()のgetName()+ "B"); 
                    LockSupport.unpark(B); 
                } 
            }  
        })。
       、B =新しいスレッド((新しいRunnableを(){ 
            @Override 
            ます。public void実行(){ 
                のために(int型私= 0;私は<10; iの++){ 
                    。System.out.printlnは(にThread.currentThread()のgetName()+」 :A "); 
                    LockSupport.unpark(A); 
                    LockSupport.park(); 
                } 
            } 
        }))。
        a.start(); 
        b.start(); 

    } 
}

  

おすすめ

転載: www.cnblogs.com/caijiwdq/p/11225822.html