アイデア:スレッドを作成するための要求
メッセージメッセージ本文
パッケージcom.dwz.concurrency2.chapter16。 パブリック クラスメッセージ{ 民間 最終文字列値。 パブリックメッセージ(文字列値){ この .VALUE = 値。 } パブリック文字列のgetValue(){ 戻り値。 } }
ハンドラの単純なバージョン(スレッドを作成するには、いくつかの要求があります)
パッケージcom.dwz.concurrency2.chapter16。 輸入java.util.Randomの。
パブリック クラスMessageHandlerの{ 民間 最終 静的ランダムランダム= 新しいランダム(のSystem.currentTimeMillis()); 公共 無効要求(メッセージメッセージ){ 新しいスレッド(() - > { String値 = message.getValue(); 試み{ のThread.sleep(にRandom.nextInt( 1000 )); System.out.printlnは(「メッセージがされます「+によってハンドル。にThread.currentThread()のgetName()); } キャッチ(InterruptedExceptionある電子){ e.printStackTrace(); } 。}))(開始。 } }
ハンドラ改良版(スレッドプールのスレッドを使用して作成)
パッケージcom.dwz.concurrency2.chapter16。 輸入java.util.Randomの。 輸入java.util.concurrent.Executor; 輸入java.util.concurrent.ExecutorService; 輸入java.util.concurrent.Executors。 パブリック クラスMessageHandlerの{ 民間 最終 静的ランダムランダム= 新しいランダム(のSystem.currentTimeMillis()); 民間 最終 静的エグゼキュータ= Executors.newFixedThreadPool(5 )。 公共 ボイド要求(メッセージメッセージ){ てexecutor.execute(() - > { 文字列値= message.getValue()。 してみてください{ のThread.sleep(にRandom.nextInt( 1000年)); System.out.println( +にThread.currentThread()のgetName()+ "" + "メッセージはによってハンドルされます。" 値)。 } キャッチ(InterruptedExceptionある電子){ e.printStackTrace(); } })。 公共 ボイドシャットダウン(){ ((ExecutorServiceの)エグゼキュータ).shutdown(); } }
テスト
パッケージcom.dwz.concurrency2.chapter16。 輸入java.util.stream.IntStream; パブリック クラスPerThreadClient { 公共 静的 ボイドメイン(文字列[]引数){ 最終 MessageHandlerのハンドラ= 新しいMessageHandlerの()。 IntStream.rangeClosed( 0、10).forEach(I - > handler.request(新しいメッセージ(String.valueOf(I))))。 handler.shutdown(); } }