デザインのアイデア:共有リソースに各スレッドの独立性を確保するために
ExecutionTask
パッケージcom.dwz.concurrency2.chapter11。 パブリック クラス ExecutionTask 実装Runnableを{ プライベート QueryFromDBActionのqueryaction = 新しいQueryFromDBAction(); プライベート QueryFromHttpAction httpAction = 新しいQueryFromHttpAction(); @Override 公共 ボイドラン(){ 最終的なコンテキストコンテキスト= 新しいコンテキスト()。 queryaction.execute(コンテキスト)。 System.out.println( "名前問い合わせに成功。" ); httpAction.execute(コンテキスト)。 System.out.printlnは(「カードIDクエリが成功しました。」); System.out.println( + context.getName()+ "の名前である" "とCARDIDは" + context.getCardId())。 } }
QueryFromDBActionによるサービスロジックの実行
パッケージcom.dwz.concurrency2.chapter11。 パブリック クラスQueryFromDBAction { 公共 ボイドは、(コンテキスト・コンテキスト)を実行{ 試み{ のThread.sleep( 1000L )。 文字列名 = "アレックス" + にThread.currentThread()のgetName()。 context.setName(名); } キャッチ(InterruptedExceptionある電子){ e.printStackTrace(); } } }
2によるQueryFromHttpActionサービスロジックの実行
パッケージcom.dwz.concurrency2.chapter11。 パブリック クラスQueryFromHttpAction { 公共 ボイド実行(コンテキスト・コンテキスト){ 文字列名 = context.getName()。 ストリングCARDID = getCardId(名); context.setCardId(CARDID)。 } プライベート文字getCardId(文字列名){ 試み{ のThread.sleep( 1000L )。 } キャッチ(InterruptedExceptionある電子){ e.printStackTrace(); } リターン "4464643 @@" + にThread.currentThread()のgetId()。 } }
コンテキストの共有リソース
パッケージcom.dwz.concurrency2.chapter11。 パブリック クラスコンテキスト{ プライベート文字列名; プライベート文字列CARDID。 公共 ボイドのsetName(文字列名){ この .nameの= 名前。 } パブリック文字列のgetName(){ 戻り 、この.nameのを、 } 公共 ボイドsetCardId(文字列CARDID){ この .cardId = CARDID。 } パブリック文字列getCardId(){ 戻りCARDIDと、 } }
テスト
パッケージcom.dwz.concurrency2.chapter11。 輸入java.util.stream.IntStream; パブリック クラスContextTest { 公共 静的 ボイドメイン(文字列[]引数){ IntStream.range( 1,5).forEach(I - > 新しいスレッド(新しいExecutionTask()))(開始); } }
スレッド間のアイソレーションを実現するために、デザインパターンを達成するためにThreadLocalのスレッドコンテキストを使用します
ExecutionTask
パッケージcom.dwz.concurrency2.chapter12。 パブリック クラス ExecutionTask 実装Runnableを{ プライベート QueryFromDBActionのqueryaction = 新しいQueryFromDBAction(); プライベート QueryFromHttpAction httpAction = 新しいQueryFromHttpAction(); @Override 公共 ボイドラン(){ queryaction.execute()。 System.out.println( "名前問い合わせに成功。" ); httpAction.execute(); System.out.println( "カードIDの問い合わせ成功しました。" ); コンテキストコンテキスト =。ActionContext.getActionContext()のgetContext(); System.out.println( + context.getName()+ "の名前である" "とCARDIDは" + context.getCardId())。 } }
するactionContext重合のThreadLocal
パッケージcom.dwz.concurrency2.chapter12。 パブリック クラスするactionContext { プライベート 静的 最終 ThreadLocalの<コンテキスト>のThreadLocal = 新規のThreadLocal <コンテキスト> (){ @Override 保護されたコンテキストはinitialValue(){ 戻り 新しいコンテキスト(); }。 }。 プライベート 静的 クラスContextHolder { プライベート 静的 最終するactionContextするactionContext = 新しいするactionContext()。 } 公共の 静的するactionContext getActionContext(){ 戻りContextHolder.actioncontextと、 } 公共コンテキストのgetContext(){ 戻りthreadlocal.get()。 } }
環境
パッケージcom.dwz.concurrency2.chapter12。 パブリック クラスコンテキスト{ プライベート文字列名; プライベート文字列CARDID。 公共 ボイドのsetName(文字列名){ この .nameの= 名前。 } パブリック文字列のgetName(){ 戻り 、この.nameのを、 } 公共 ボイドsetCardId(文字列CARDID){ この .cardId = CARDID。 } パブリック文字列getCardId(){ 戻りCARDIDと、 } }
QueryFromDBAction
パッケージcom.dwz.concurrency2.chapter12。 パブリック クラスQueryFromDBActionは{ 公共 ボイドは、実行(){ 試み{ のThread.sleep( 1000L )。 文字列名 = "アレックス" + にThread.currentThread()のgetName()。 ActionContext.getActionContext()のgetContext()のsetName(名)。。。 } キャッチ(InterruptedExceptionある電子){ e.printStackTrace(); } } }
QueryFromHttpAction
パッケージcom.dwz.concurrency2.chapter12。 パブリック クラスQueryFromHttpAction { 公共 ボイド(){実行 コンテキストコンテキスト = ActionContext.getActionContext()のgetContextを()。 文字列名 = context.getName()。 ストリングCARDID = getCardId(名); context.setCardId(CARDID)。 } プライベート文字getCardId(文字列名){ 試み{ のThread.sleep( 1000L )。 } キャッチ(InterruptedExceptionある電子){ e.printStackTrace(); } 戻り "4464643 @@" + にThread.currentThread()のgetId()。 } }
テスト
パッケージcom.dwz.concurrency2.chapter12。 輸入java.util.stream.IntStream; パブリック クラスContextTest { 公共 静的 ボイドメイン(文字列[]引数){ IntStream.range( 1,5).forEach(I - > 新しいスレッド(新しいExecutionTask()))(開始); } }