一。java
1>Callable和Future接口介紹異步
Callable是相似於Runnable的接口,實現Callable接口的類和實現Runnable的類都是能夠被建立爲線程的來執行的類。ide
2>Callable和Runnable比較測試
1. Callable規定的方法是call,Runnable規定的方法是runthis
2. callable的任務執行後能夠返回值,Runnable的run是無返回值的
spa
3.call方法能夠拋出異常,run方法不能拋出異常。咱們能夠根據call方法是否拋出異常進行不一樣操做(由於try-catch不該該做爲控制流程的條件,因此不推薦這樣作);線程
4.運行callable任務可拿到一個Future對象,Future表示的是異步計算結果,它提供了檢查計算是否完成的方法和等待計算完成檢索計算結果的方法。經過Future對象能夠了解任務的執行狀況,能夠取消任務的執行,還能夠獲取任務執行的結果。
code
3>Future中的方法介紹對象
1.future.get()將等待callable線程執行返回結果。future.get(timeout, unit)若是等待超時將拋出超時異常。接口
2.future.cancel(boolean)將試圖終端當前線程,boolean做用帶研究
例子測試,代碼以下,注意被注掉的兩個地方,能夠去掉註釋運行試試
public class CallableTest { public static class MyCallableClass implements Callable<String>{ private int flag=0; public MyCallableClass(int flag){ this.flag=flag; } @Override public String call() throws Exception { if(flag==3){ while(true){ System.out.println("在執行線程3"); Thread.sleep(5000); } } Thread.sleep(5000); return "線程"+flag+"執行完"; } } public static void main(String[] args) { MyCallableClass callableClass=new MyCallableClass(0); MyCallableClass callableClass2=new MyCallableClass(1); MyCallableClass callableClass3=new MyCallableClass(2); ExecutorService service=Executors.newFixedThreadPool(3); try { Future<String> future2=service.submit(callableClass2); Future<String> future=service.submit(callableClass3); // System.out.println(future.cancel(false)); System.out.println(future2.get()); System.out.println(future.get()); Future<String> future3=service.submit(callableClass); System.out.println("task3"+future3.get()); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } // catch (Exception e) { // e.printStackTrace(); // } service.shutdownNow(); } }