import java.util.ArrayList; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; /** * Java線程:有返回值的線程 * @author <a href="http://git.oschina.net/denger"> 羊登瓊 </a> */ public class CallableTest { public static void main(String[] args) throws ExecutionException, InterruptedException { int threadNum = 4; // 建立一個線程池 ExecutorService pool = Executors.newCachedThreadPool(); // // 建立兩個有返回值的任務 // Callable c1 = new MyCallable("A"); // Callable c2 = new MyCallable("B"); // // // 執行任務並獲取Future對象 // Future f1 = pool.submit(c1); // Future f2 = pool.submit(c2); // // // 從Future對象上獲取任務的返回值,並輸出到控制檯 // System.out.println(">>>" + f1.get().toString()); // System.out.println(">>>" + f2.get().toString()); /** * 表示各個線程返回結果的總和 */ int count = 0; int waitTime = 10; /** * 存放線程結果的對象,爲了讓main線程循環詢問子線程結果,進行等待 */ List<Future<Integer>> futures = new ArrayList<>(); // 建立4個線程 for (int i = 0; i < threadNum; i++) { MyCallable c1 = new MyCallable("" + i, 400); Future<Integer> future = pool.submit(c1); futures.add(future); } // 進行判斷線程是否結束,目的是讓main主線程等待子線程 boolean isDone = false; for (Future<Integer> future : futures) { do { isDone = future.isDone(); if (isDone) { count = count + future.get(); } else { // 等待兩秒,由於它一直詢問,執行者很煩,我以爲效率會耽誤執行者 System.out.printf("main主線程進行等待...%s毫秒(ms)\n", waitTime); Thread.sleep(waitTime); } } while (!isDone); isDone = false; } // 線程阻塞結束 System.out.println(String.format("總共執行%s", count)); // 關閉線程池 pool.shutdown(); } } /** * 線程類 * @author <a href="http://git.oschina.net/denger"> 羊登瓊 </a> */ class MyCallable implements Callable<Integer> { /** * 存放變量 */ private String oid; /** * 循環次數表明業務處理 */ private Integer length = 400; MyCallable(String oid, Integer length) { this.oid = oid; this.length = length; } @Override public Integer call() throws Exception { for (int i = 0; i < length; i++) { System.out.println(String.format("%s_____線程的任務_____%s", oid, i)); } return length; } }
之後有須要的時候回來參考一下,腦殼再好也沒有筆記好java