スレッドコンテキスト

// 単一の実施形態のように設計された
公共の最終クラスする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(14 
                .forEach(I - >
                         新しいスレッド(新しい ExecutionTask()、" 【线程" + I + " " ).start()
                ); 
    } 
}

 

おすすめ

転載: www.cnblogs.com/moris5013/p/11779477.html
おすすめ