// 単一の実施形態のように設計された 公共の最終クラスするactionContext { // コンストラクタ民営 プライベートするactionContext(){ } // ホルダークラス プライベート 静的 クラスContextHolder { プライベート最終静的するactionContextするactionContext = 新しい新するactionContext(); } // の外用に供給されます パブリック 静的するactionContext getActionContext(){ 戻りContextHolder.actionContextを; } // プロパティ 公共コンテキストのgetContext(){ リターンTHREADLOCAL。取得(); } // 属性 プライベート最終ThreadLocalの<コンテキスト> THREADLOCAL = 新規のThreadLocal <コンテキスト> (){ @Override 保護されたコンテキストはinitialValue(){ 戻り 新しいコンテキスト(); } }。 } パブリック クラスコンテキスト{ プライベート文字列名。 プライベート文字列CARDID。 パブリック文字列getCardId(){ 戻りCARDIDと、 } 公共 ボイドsetCardId(文字列CARDID){ この.cardId = CARDID。 } パブリック文字列のgetName(){ 戻り 、この.nameのを、 } 公共 ボイドのsetName(文字列名){ この .nameの= 名前。 } } パブリック クラスExecutionTaskはRunnableを{実装 プライベート QueryFromDBAction queryAction = 新しいQueryFromDBAction()。 プライベート QueryFromHttpAction httpAction = 新しいQueryFromHttpAction(); @Override 公共 ボイドラン(){ queryAction.execute()。 システム。アウト .println(「名前のクエリが成功しました」); httpAction.execute(); システム。アウト .println(" CARDIDクエリが成功しました" ); コンテキストコンテキスト = ActionContext.getActionContext()のgetContext()。 システム。アウト .println(" 名は" + context.getName()+ " とCARDIDは" + context.getCardId())。 } } パブリック クラスQueryFromDBAction { 公共 ボイドは、実行(){ 試す{ のThread.sleep(1000L )。 文字列名 =にThread.currentThread()のgetName()+。" 中的ジャック" 。 ActionContext.getActionContext()のgetContext()のsetName(名)。。。 } キャッチ(InterruptedExceptionある電子){ e.printStackTrace(); } } } パブリック クラスQueryFromHttpAction { 公共 ボイドは、実行(){ コンテキストコンテキスト = ActionContext.getActionContext()のgetContext()。 文字列名 = context.getName()。 ストリングCARDID = getCardId(名); context.setCardId(CARDID)。 } プライベート文字getCardId(文字列名){ 試みる{ のThread.sleep(1000Lを) } キャッチ(InterruptedExceptionある電子){ e.printStackTrace(); } を返す。にThread.currentThread()のgetName()+ " 中的CARDIDを" 。 } } パブリック クラスContextTest { 公共 静的 ボイドメイン(文字列[]引数){ IntStream.rangeClosed(1、4 ) .forEach(I - > 新しいスレッド(新しい ExecutionTask()、" 【线程" + I + " 】" ).start() ); } }