標籤:並發 mail static new submit util current over bool
submit方法會產生Future對象,它用Callable返回結果的特定類型進行了參數化,可以用isDone()的方法來查詢Future是否已經完成。當任務完成是,它具有一個結果,可以調用get()方法來擷取該結果。
/** * @Title: TaskWithResult.java * @Package zeze * @Description: TODO(用一句話描述該檔案做什麼) * @author A18ccms A18ccms_gmail_com * @date 2017年2月8日 上午10:51:26 * @version V1.0 */package zeze;import java.util.ArrayList;import java.util.concurrent.Callable;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Future;public class CallableDemo { public static void main(String[] args) { ExecutorService exec = Executors.newCachedThreadPool(); ArrayList<Future<String>> results = new ArrayList<Future<String>>(); for (int i = 0; i < 10; i++) { results.add(exec.submit(new TaskWithResult(i))); } for (Future<String> fs : results) { try { System.out.println(fs.get()); } catch (Exception e) { System.err.println(e); } finally { exec.shutdown(); } } }}class TaskWithResult implements Callable<String> { private int id; public TaskWithResult(int id) { this.id = id; } @Override public String call() { return "result of TaskWithResult " + id; }}
用isDone()的方法來查詢Future是否已經完成
boolean isDone = false; while (!isDone) { logger.info(Thread.currentThread().getName() + " 線程是否結束?"+ runningFlag+"; 隊列大小=" + nextDepthQueue.size()); isDone = true; for (Future<Object> future : futureList) { if (!future.isDone()) { isDone = false; try { Thread.sleep(3000); } catch (InterruptedException e) { } break; } } }
Java Callable並發編程模板