1. 程式人生 > >Java多線程Callable和Future類詳解

Java多線程Callable和Future類詳解

完成後 使用 str this In ret 類型 all 線程池

public interface Callable<V> 返回結果並且可能拋出異常的任務。實現者定義了一個不帶任何參數的叫做 call 的方法

public interface Future<V> Future 表示異步計算的結果。計算完成後只能使用 get 方法來獲取結果

1.線程處理返回結果

    一般開發中,使用多線程,最常見的就是:1.實現Runnable接口;2.繼承Thread類。

    但是run方法是沒有返回結果,很難滿足我們的需求。這時,常用的辦法就是實現Callable接口

    Callable接口提供了一個call方法入口,我們可以通過實現call方法,來執行任務;這個接口支持泛型,可以通過泛型參數,來獲取想要的結果類型

  2.關閉線程池

    可以通過調用線程池的shutdown或shutdowNow方法來關閉線程池,但是它們的實現原理不同。

    shutdown的原理只是將線程池的狀態設置SHUTDOWN狀態,然後中斷沒有開始執行任務的線程。

    shutdownNow的原理是遍歷線程池中的工作線程,然後逐個調用線程的interrupt方法來中斷線程,所以需要註意一點,如果存在無法響應中斷的任務,可能永遠無法終止。shutdownNow會首先將線程池的狀態設置成STOP,然後嘗試停止所有的正在執行或暫停任務的線程,並返回等待執行任務的列表

package com.yyx.test;

import
java.util.concurrent.Callable; public class MyCallable implements Callable<String> { private String name; public MyCallable(String name) { this.name = name; } @Override public String call() throws Exception { return name + "任務返回的內容"; } }
package com.yyx.test;

import java.util.ArrayList; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public class CallableFutureTest { public static void main(String[] args) { try { // 創建一個線程池 ExecutorService pool=Executors.newCachedThreadPool(); // 創建多個有返回值的任務 List<Future> listFuture=new ArrayList<Future>(); for(int i=1;i<=5;i++) { Callable c = new MyCallable("第"+i + "個線程"); // 執行任務並獲取Future對象 Future f = pool.submit(c); //判斷Future對象是否已經完成 if (f.isDone()) { listFuture.add(f); } } // 關閉線程池 pool.shutdown(); // 獲取所有並發任務的運行結果 for (Future future : listFuture) { // 從Future對象上獲取任務的返回值,並輸出到控制臺 System.out.println(">>>" + future.get().toString()); } } catch (Exception e) { e.printStackTrace(); } } }

Java多線程Callable和Future類詳解