3のスレッドプールを作成する方法であって:
// 空きスレッドがある場合は、各タスクについて、すぐに彼の任務、聞かせて使用可能です // アイドルスレッドがスレッドを作成しません。 プール= ExecutorServiceのExecutors.newCachedThreadPool(); // 固定サイズのスレッドプール、タスクの数>アイドル状態のスレッド、タスクキュー未配信で ExecutorServiceのプール= Executors.newFixedThreadPool; // スレッドプール1の大きさの低下、タスクごとのスレッドの実行が提出しました。 ExecutorServiceのプール= Executors.newSingleThreadPool()。
2.スレッドプールにタスクを割り当てます。
// 返されるオブジェクトはisCancelled、)(キャンセル)(isDoneを呼び出すことができます <?>今後の提出(Runnableをタスク); // GET()指定された結果オブジェクトを返し 今後は<T> (Runnableをタスク、T結果)を提出; / / 結果に返されるオブジェクトは、それを取得する準備が整いました。 フューチャー<T>提出(呼び出し可能< T>タスク)。
スレッドプール、コール・シャットダウンが()スレッドプールのシャットダウンシーケンスを開始する際に3切れ。タスクが完了すると、アクチュエータは、もはや新しいタスクを受け入れないスレッドプールのスレッド死をオフにしています。
4.ケース:ディレクトリを考えると、このドキュメントでは、中国の数を見つけるためのディレクトリが指定されたキーワードを含む文書です。
条件:ディレクトリ、キーワード
4.1 Taskクラス(Threadクラス)
/ ** スレッドタスク:特定のキーワードディレクトリの計算を含むすべてのファイルの数。* / クラス MatchCounter 実装呼び出し可能<整数> { プライベートファイルディレクトリ; プライベート文字列のキーワード; プライベートExecutorServiceのプール、 プライベート int型のCOUNT; / ** 。* MatchCounterを構築します * @Param ディレクトリ指定したディレクトリ * @paramのキーワードキーワード * @ PARAM のタスクを実行するために使用されるプールのスレッドプール * / 公共MatchCounter(ファイルディレクトリ、文字列のキーワード、ExecutorServiceのプール) { これを= .directory ディレクトリ; この .keyword = キーワード; この .pool = プール; } @Override 公共整数コール() { COUNT = 0 ; 試み { ファイル[]ファイル =のdirectory.listFiles(); // スレッドの実行結果セット リスト<今後の<整数>>結果= 新しい新しいのArrayList <> (); のために(ファイルのファイル:ファイル) // 指定したディレクトリ内のすべてのファイルを反復 // フォルダの場合 であれば(file.isDirectory()) { // 再帰 MatchCounterカウンタ= 新新MatchCounter(ファイル、キーワード、プール); 今後の <整数> =結果pool.submit(カウンタ); results.add(結果); } // もしファイル、キーワードが含まれているかどうかを確認するために、検索()メソッドを呼び出します。 他の { IF(検索(ファイル))COUNT ++ ; } のための(未来の<整数> 結果:結果) 試し { int型 A = result.get(); COUNT + =result.get(); } キャッチ(ExecutionException電子) { e.printStackTrace(); } } キャッチ(InterruptedExceptionあるE) { } 戻り数えます。 } / ** *指定したキーワードのファイルを検索します。 * @paramは、検索するファイルをファイル * @return キーワードがファイルに含まれている場合はtrue * / パブリック ブール検索(ファイルのファイル) { しようと { みてください(=スキャナ新しいスキャナ(ファイル、 "UTF-8" )) { ブール =が見つかっ偽。 一方、(見出さ&&!in.hasNextLine()) { 文字列の行 = in.nextLine()。 もし(line.contains(キーワード))が発見= 真; } 戻り見つかりました。 } } キャッチ(IOExceptionを電子) { 戻り 偽。 } } }
4.2メインプログラム
パブリック クラスThreadPoolTest { 公共の 静的な 無効メイン(文字列[] argsが)スロー例外 { 試してみる(=スキャナ新新しいスキャナ(System.in)) { System.out.print(「検索するディレクトリを入力してください:」を); 文字列のディレクトリを = in.nextLine(); System.out.print( "を見つけるためにキーワードを入力してください:" ); 文字列キーワード = in.nextLine(); ExecutorServiceのプール = Executors.newCachedThreadPool(); MatchCounterカウンタ =新しい MatchCounter(新しいファイル(ディレクトリ)、キーワード、プール)。 将来 <整数>結果= pool.submit(カウンタ) してみてください { System.out.printlnは(result.get() + "匹配的文件" ); } キャッチ(ExecutionException電子) { e.printStackTrace(); } キャッチ(InterruptedExceptionある電子) { } pool.shutdown()。 INT largestPoolSize = ((ThreadPoolExecutor)プール).getLargestPoolSize(); System.out.printlnは(+ "スレッドプール=の最大数" largestPoolSize); } } }
4.3業績: