デザインパターンのマルチスレッド実行コンテキスト

デザインのアイデア:共有リソースに各スレッドの独立性を確保するために

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()))(開始); 
    } 
}

 

おすすめ

転載: www.cnblogs.com/zheaven/p/12155828.html