除了繼承Thread類和實現Runnable接口兩種建立線程的方式,JDK5.0還新增類兩種線程建立方式:java
好處:
(1)與使用Runnable相比,Callable功能更強大些
(2)相比run()方法,能夠有返回值
(3)方法能夠拋出異常
(4)支持泛型的返回值
(5)須要藉助FutureTask類,好比獲取返回結果
Future接口:
1)能夠對具體的Runnable\Callable任務的執行結果進行取消、查詢是否完成、獲取結果等
2)FutureTask是Future接口惟一的實現類
3)FutureTask同時實現了Runnable,Future接口。
【它既能夠做爲Runnable被線程執行,又能夠做爲Future獲得Callable的返回值】ide
//1.建立實現類 class NumThread implements Callable { //2.重寫call()方法 @Override public Object call() throws Exception { int sum=0; for(int i=1;i<=100;i++){ if(i%2==0){ System.out.println(i); sum+=i; } } return sum; } } public class ThreadNew { public static void main(String[] args) { //3.建立實現Callable接口的實例對象 NumThread numThread = new NumThread(); //4.將實現類的對象做爲參數傳遞到FutureTask構造器,建立 FutureTask對象 FutureTask futureTask = new FutureTask(numThread); //5.將FutureTask的對象做爲參數傳遞到Thread類的構造器中,並調用start() new Thread(futureTask).start(); //6.須要的話,能夠藉助FutureTask的對象進行一系列操做 try { //get()返回值爲FutureTask構造器參數Callable實現類重寫的call()的返回值 Object sum = futureTask.get(); System.out.println("總和:"+sum); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } }
好處:工具
1)提升響應速度--減小建立新線程的時間
2)下降資源消耗--重複利用線程池中的線程,不須要每次都建立
3)便於線程管理:
corePoolSize:核心池的大小
maximumPoolSize:最大線程數
keepAliveTime:線程沒有任務時最多保持多長時間會終止
線程池相關API--ExecutorService和Executors
ExecutorService:真正的線程池接口,常見子類ThreadPoolExecutor
Executors:工具類、線程池的工廠類。用於建立並返回不一樣類型的線程池
線程