程序中使用的是Callable接口,可以獲取線程的返回值。
package liuzh; import java.util.LinkedList; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import java.util.concurrent.LinkedBlockingDeque; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; class Task implements Callable<String> { private String filename; public Task(String filename) { this.filename = filename; } @Override public String call() throws Exception { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("完成 "+ filename); return "返回值" + filename; } } /** * 創建一個線程池,將50個任務分配進去,並發量最大為5 * 運行結束后,輸出每個線程返回的結束 * title:ThreadPoolExecutorTest * descript: * @author liuzh * @date 2016年5月18日 下午8:16:26 */ public class ThreadPoolExecutorTest { public void start() throws InterruptedException, ExecutionException { /** * 創建線程池,並發量最大為5 * LinkedBlockingDeque,表示執行任務或者放入隊列 */ ThreadPoolExecutor tpe = new ThreadPoolExecutor(5, 10, 0, TimeUnit.SECONDS, new LinkedBlockingDeque<Runnable>(), new ThreadPoolExecutor.CallerRunsPolicy()); //存儲線程的返回值 List<Future<String>> results = new LinkedList<Future<String>>(); for (int i = 0; i < 10; i++) { Task task = new Task(String.valueOf(i)); System.out.println("放入線程池:" + i); //調用submit可以獲得線程的返回值 Future<String> result = tpe.submit(task); results.add(result); } //此函數表示不再接收新任務, //如果不調用,awaitTermination將一直阻塞 tpe.shutdown(); //1天,模擬永遠等待 System.out.println(tpe.awaitTermination(1, TimeUnit.DAYS)); //輸出結果 for (int i = 0; i < 10; i++) { System.out.println(results.get(i).get()); } } public static void main(String[] args) throws InterruptedException, ExecutionException { ThreadPoolExecutorTest test = new ThreadPoolExecutorTest(); test.start(); } }
輸出樣例:
放入線程池:0
放入線程池:1
放入線程池:2
放入線程池:3
放入線程池:4
放入線程池:5
放入線程池:6
放入線程池:7
放入線程池:8
放入線程池:9
完成 1
完成 0
完成 2
完成 3
完成 4
完成 9
完成 6
完成 8
完成 5
完成 7
true
返回值0
返回值1
返回值2
返回值3
返回值4
返回值5
返回值6
返回值7
返回值8
返回值9
參考:http://www.cnblogs.com/vhua/p/5277694.html
http://www.cnblogs.com/hzmark/archive/2013/01/21/JavaExecutor.html