首頁 > 軟體

java多執行緒建立方式三Callable

2019-12-10 19:38:23

在前面我們講述了建立執行緒的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是支援泛型的



IT145.com E-mail:sddin#qq.com