2021-05-12 14:32:11
java多執行緒建立方式三Callable
在前面我們講述了建立執行緒的2種方式,一種是直接繼承Thread,另外一種就是實現Runnable介面。
這2種方式都有一個缺陷就是:在執行完任務之後無法獲取執行結果。
如果需要獲取執行結果,就必須通過共用變數或者使用執行緒通訊的方式來達到效果,這樣使用起來就比較麻煩。
而自從Java 1.5開始,就提供了Callable和Future,通過它們可以在任務執行完畢之後得到任務執行結果。
今天我們就來討論一下Callable、Future和FutureTask三個類的使用方法。以下是本文的目錄大綱:
一.Callable與Runnable
二.Future
三.FutureTask
1
建立一個實現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;
}
}
2
編寫測試類
程式碼如下所示:
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();
}
}
}
3
程式碼詳解:1、相較於Thread和Runable實現多執行緒的方式其可以獲取執行緒執行的返回值2、在NumThread 中的以下程式碼是根據set方法方式向callable實現類中傳引數,然後再call方法中使用。private int length;public void setLength(int length) {this.length = length;}4
測試
執行程式碼
5
總結:
如何理解實現callable介面的方式建立多執行緒比實現Runable介面建立執行緒的方式強大?
1、call() 可以返回任意值
2、call() 可以丟擲異常,被外面的操作捕獲,獲取異常的資訊
3、Callable是支援泛型的
相關文章