在前面我們講述了建立線程的2種體例,一種是直接擔當Thread,別的一種就是實現Runnable接口。
這2種體例都有一個缺陷就是:在執行完使命之后無法獲取執行成果。
若是需要獲取執行成果,就必需經由過程共享變量或者利用線程通信的體例來達到結果,這樣利用起來就比力麻煩。
而自從Java 1.5起頭,就供給了Callable和Future,經由過程它們可以在使命執行完畢之后獲得使命執行成果。
今天我們就來會商一下Callable、Future和FutureTask三個類的利用方式。以下是本文的目次綱領:
一.Callable與Runnable
二.Future
三.FutureTask
建立一個實現callable的實現類
具體代碼如下所示:
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
/**
* 建立線程的體例三:實現callable接口 --》jdk5.0新增
*/
// 1、建立一個實現callable的實現類
public class NumThread implements Callable<Integer> {
private int length;
public void setLength(int length) {
this.length = length;
}
// 2、實現call方式,將此線程需要執行的操出聲明在call方式中
public Integer call() throws Exception {
int sum = 0;
for (int i = 0; i <= length; i++) {
if (i % 2 == 0) {
sum += i;
System.out.println(i);
}
}
return sum;
}
}
 編寫測試類
代碼如下所示:
import java.util.concurrent.FutureTask;
public class ThreadNew {
public static void main(String[] args) {
// 3、建立callable實現類的對象
NumThread numThread = new NumThread();
// 3.1 傳參數
numThread.setLength(100);
// 4、將此callable實現類的對象作為參數傳遞到FutureTask的機關器中,建立FutureTask對象
FutureTask<Integer> integerFutureTask = new FutureTask<Integer>(
numThread);
// 5、將FutureTask作為參數傳遞Thread機關器中,建立Thread對象,并挪用start方式
new Thread(integerFutureTask).start();
try {
// 6、獲取Callable中call方式中的返回值
// get()返回值即為futureTask機關器參數Callable實現類重寫的call的返回值
Integer sum = integerFutureTask.get();
System.out.println("總計:" + sum);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
 代碼詳解:
1、相較于Thread和Runable實現多線程的體例其可以獲取線程執行的返回值
2、在NumThread 中的以下代碼是按照set方式體例標的目的callable實現類中傳參數,然后再call方式中利用。
private int length;
public void setLength(int length) {
this.length = length;
}
測試
運行代碼
 
 總結:
若何理解實現callable接口的體例建立多線程比實現Runable接口建立線程的體例壯大?
1、call() 可以返回肆意值
2、call() 可以拋出異常,被外面的操作捕捉,獲取異常的信息
3、Callable是撐持泛型的
 0 篇文章
如果覺得我的文章對您有用,請隨意打賞。你的支持將鼓勵我繼續創作!