Java - Thread 執行緒(三) - interface Callable

By sunwc 2023-03-24 Java

JDK 5.0 新增

新執行緒的創建 (Multi-threading) - 實現 interface Callable 之步驟

1.創建一個實現了 interface Callable 的類別

2.實現類去實現 Callable 的抽象方法: call(),將此執行緒需要執行的程式寫在這裡

3.創建實現類的物件

4.將此物件作為參數傳遞到 FutureTask<T> 類的建構子(constructor)

5.將FutureTask<T>物件作為參數傳遞到 Thread 類的建構子(constructor)中並調用 start()

6.取得 Callable 中 call()的回傳值


interface Callable vs. interface Runnable 的好處

  • call() 有回傳值
  • call() 可以拋出例外,被外面的操作捕獲,取得例外的訊息
  • Callable 支持泛型

例子


/**
 * 1-100之間求偶數之和
 * @author sunwc
 * @create 2023-03-24 下午 08:46
 */
public class EvenAmount {

    public static void main(String[] args) {
        NumberThread numberThread = new NumberThread();
        FutureTask futureTask = new FutureTask(numberThread);

        new Thread(futureTask).start();

        try {

            // get() 即為調用call() 的回傳值
            Object sum = futureTask.get();
            System.out.println("偶數之和:" + sum);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }

}

class NumberThread implements Callable {

    @Override
    public Object call() throws Exception {

        int sum = 0;
        for (int i = 1; i <= 100 ; i++) {
            if (i % 2 == 0) {
                sum += i;
            }
        }
        return sum;
    }
}

輸出結果:

偶數之和:2550

延伸學習:有關透過 Thread Pool 達成 Multi-threading,可以參考我的另一篇文章 Java - Thread 執行緒(四) Thread Pool