java中的Callable和Future的使用和困惑
阿新 • • 發佈:2019-02-09
java中還提供了可以返回值的執行緒池,例子如下:
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; public class CallableAndFuture { /** * @param args */ public static void main(String[] args) { ExecutorService threadPool = Executors.newSingleThreadExecutor(); Future<String> future = threadPool.submit(new Callable<String>(){ @Override public String call() throws Exception { Thread.sleep(3000); return "future"; } }); try { System.out.println("waiting..."); System.out.println(future.get()); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } }
future.get()結果出來之前,要等待一會
future.get(300, TimeUnit.MILLISECONDS);然而這個如果在規定的時間內沒有完成,則停止,並且跑出超時異常
還有需要注意的地方,Callable中的泛型和call方法的型別一直,並且還要和Future的泛型型別一致。
下面的例子是,可以返回多個Future物件
//建立執行緒池 ExecutorService pool = Executors.newFixedThreadPool(10); //建立CompletionService例項 CompletionService<Integer> completionService = new ExecutorCompletionService<Integer>(pool); //提交任務 for(int i = 0;i < 10; i++){ final int index = i; completionService.submit(new Callable<Integer>(){ @Override public Integer call() throws Exception { return index; } }); } //獲得結果 for(int i = 0;i<10;i++){ try { Future<Integer> future2 = completionService.take(); System.out.println(future2.get()); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } }
困惑:不知道用在什麼地方,業務需求沒有碰到過這種情況