サンプル
SampleThread.java
import java.text.SimpleDateFormat; public class SampleThread implements Runnable { private SimpleDateFormat simpleDateFormat = new SimpleDateFormat( "HH:mm:ss SSS"); @Override public void run() { System.out.println("Time : "+ simpleDateFormat.format(System.currentTimeMillis())); } }
Main.java
import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.RejectedExecutionHandler; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; public class Main { public static void main(String[] args) { // プールしておく最小のスレッド数 int corePoolSize = 2; // 最大スレッド数 int maximumPoolSize = 2; // 仕事がなかったと判断されるまでの待ち時間 long keepAliveTime = 500; // keepAliveTimeの時間単位 TimeUnit unit = TimeUnit.SECONDS; // タスクを登録するためのキュー BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<Runnable>(); // ポリシー RejectedExecutionHandler handler = new ThreadPoolExecutor.CallerRunsPolicy(); ThreadPoolExecutor threadPool = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, handler); try { // shutdown()を呼ぶ前であれば、タスクを後から追加することもできる for (int i = 0; i < 10; i++) { Thread.sleep(1000); threadPool.execute(new SampleThread()); } } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { // 必ずshutdownを実行 System.out.println("ShutDown実行。"); threadPool.shutdown(); } System.out.println("処理終了"); } }
出力結果
Time : 23:48:56 335 Time : 23:48:57 336 Time : 23:48:58 335 Time : 23:48:59 335 Time : 23:49:00 335 Time : 23:49:01 336 Time : 23:49:02 336 Time : 23:49:03 336 Time : 23:49:04 336 ShutDown実行。 Time : 23:49:05 337 処理終了
参考文献
http://www.nminoru.jp/~nminoru/java/j2se15_concurrent.htmlhttp://akiyoshi220.blogspot.jp/2010/03/threadpoolexecutor-1.html
http://akiyoshi220.blogspot.jp/2010/03/threadpoolexecutor-2.html