マルチスレッドの共有データ

 一般的なオペレーティングデータと一致複数のスレッドの動作は、この最も古典的な例は、チケットです

パブリック クラスShareData {
     プライベート int型 NUM = 10 ;
    公共同期無効INC(){ 
        NUM ++ ; 
        システム。アウト .println(にThread.currentThread()のgetName()+ " 调用INC这个方法NUM = " + NUM)。
        してみてください{ 
            のThread.sleep(1000 ); 
        } キャッチ(InterruptedExceptionある電子){ 
            e.printStackTrace(); 
        } 
    } 
}
パッケージcom.example.threadTest; 

/ * * 
 *説明:冬眠
 * 2019年6月1日にレノボによって作成された午後07時33分
 * / 
パブリック クラスのチケットはRunnableを実装して、{
     プライベート; ShareData shareDataを 

    パブリックチケット(ShareData shareData){
         この .shareData = shareData。
    } 

    パブリックチケット(){ 

    } 

    @Override 
    公共 ボイドラン(){
         ためint型 i = 0 ; iは< 5 ; iは++ ){ 
            shareData.inc()。
        } 
    }
    パブリック 静的 ボイドメイン(文字列[]引数){ 
        ShareData shareData = 新しいShareData()。
        以下のためにint型 i = 0 ; iは< 4 I ++; ){
           新しいスレッド(新しいチケット(shareData)、" スレッド" + )(I).startと、
      } 
    } 


}

2.複数のスレッド一貫性のない行動、一般的なオペレーティングデータ

コードは、実行のスレッドごとに異なるのRunnableオブジェクトを呼び出す必要で、この時間の間異なる場合、Runnableオブジェクトの間でデータを共有する2つの方法があります

、共有データを別のオブジェクトにカプセル化され、のために実装することが容易であるように、各スレッドを動作させる方法は、その目的を達成するために、共有データ本体に割り当てられる、これらのオブジェクトRunnableオブジェクトのそれぞれに一つずつ転送

データ通信の各動作の相互に排他的で行います。

ねえ、この概要を見て夜が明けを達成するために見ていきます。

ここでデータが共有オブジェクトの異なる実装を追加します。

 

パッケージcom.example.demo1。

/ * * 
 *説明:冬眠
 * 19時57分2019年6月1日にレノボによって作成
 * / 
パブリック クラスMyThreadはRunnableを実装して、{
     プライベートSharaData sharaDataを。
    パブリックMyThread(){ 

    } 

    公共MyThread(SharaData sharaData){
         この .sharaData = sharaData。
    } 

    パブリック 静的 ボイドメイン(文字列[]引数){ 

        SharaData sharaData = 新しいSharaData()。
        以下のためにint型 = Iを0 ; iは< 4;私は++ ){
             場合(I%2 == 0 ){
                 新しいスレッド(新しい MyThread(sharaData)、" スレッド" + )(.startをI)。
            } {
                 新しいスレッド(新しい MyThreadDec(sharaData)、" スレッド" + I).start(); 
            } 
        } 
    } 
    // 封装共享数据类



    @Override 
    公共 ボイドラン(){
     ためint型 I = 0 ; iが<5 ; iは++ ){ 
        sharaData.inc()。

    } 
    } 
}

 

// 
パッケージcom.example.demo1。
/ * * *説明:冬眠 * 2019年6月1日20時07分にレノボによって作成 * / パブリック クラスMyThreadDecはRunnableを実装して{ // 数据封装共享 プライベートSharaData sharaDataを。 公共MyThreadDec(SharaData sharaData){ この .sharaData = sharaData。 } @Override 公共 ボイドラン(){ ためint型 i = 0 ; iは< 5 ; iは++ ){ sharaData.dec()。 } } }
//共有データクラスの
パッケージcom.example.demo1;
/ * * *説明:Hibernateは * 2019年6月1日19:57 ONレノボによって作成 * / パブリック クラスSharaData { プライベート int型 NUM = 10 ; 公共同期無効INCがあります() { NUM ++ ; 。システムOUT .println(にThread.currentThread()のgetName()+ " を呼び出し、このメソッドINC = NUM " + NUM); 試み{ のThread.sleep(1000年); } キャッチ(InterruptedExceptionある電子){ e.printStackTrace(); } } パブリック同期ボイド12月(){ NUM ++ システム。アウト .println(にThread.currentThread()のgetName()+ " 调用INC这个方法NUM = " + NUM)。 してみてください{ のThread.sleep(1000 ); } キャッチ(InterruptedExceptionある電子){ e.printStackTrace(); } } }

 

第二の方法

これらのクラスとしてRunnableオブジェクト、内部クラス、外部クラスのメンバ変数としてデータを共有、操作の方法あなたは、共有データへの各スレッドは、外部クラスに割り当てられ,,

共有データと様々な通信動作を相互排除を達成するために、クラス内の各外部Runnableオブジェクトクラスとしてこれらのメソッドを呼び出します

パッケージcom.example.demo1。

/ * * 
 *説明:休止
 * 2019年6月1日20:33にLenovoが作成
 * / 
パブリック クラススレッド2 {
     公共 静的 ボイドメイン(文字列[]引数){ 
        最終SharaData sharaData =   新しいSharaData()。
       以下のためにint型 i = 0 ; iは< 4 ; iは++ ){
            場合(私の%2 == 0 ){
                新しいスレッド(新しいRunnableを(){ 
                   @Override 
                   公共 ボイドラン(){
                        ためint型 i = 0 ; iは< 5 ; iは++ ){ 
                           sharaData.inc()。
                       } 
                   } 
               }、" スレッド" + I).start(); 
           } {
                  新しいスレッド(新しいRunnableを(){ 
                     @Override 
                     公共 ボイドラン(){
                          のためには、int型 I = 0を、私は< 5 ; I ++){
                             sharaData.dec(); 
                         } 
                     } 
                 }、" スレッド" + I).start(); 
           } 
       } 
    } 

}

 

おすすめ

転載: www.cnblogs.com/zhulina-917/p/10960888.html