一般的なオペレーティングデータと一致複数のスレッドの動作は、この最も古典的な例は、チケットです
パブリック クラス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(); } } } }