首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 5 線程新特性:Callable 與 Future 實現有返回值線程

     編輯:Java 相關知識

從 Runnable 到 Callable

Java 5 前線程無返回值,需通過共享變量、回調等繞道。Java 5 引入 Callable 接口:

  • V call() throws Exception:有返回值、可拋異常
  • 配合 Future 獲取結果:get() 阻塞等待完成
  • 提交給 ExecutorService.submit(Callable) 返回 Future

完整代碼示例

import java.util.concurrent.*;

public class Test {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        ExecutorService pool = Executors.newFixedThreadPool(2);
        Callable c1 = new MyCallable("A");
        Callable c2 = new MyCallable("B");
        Future f1 = pool.submit(c1);
        Future f2 = pool.submit(c2);
        System.out.println(">>>" + f1.get()); // 阻塞獲取結果
        System.out.println(">>>" + f2.get());
        pool.shutdown();
    }
}

class MyCallable implements Callable {
    private String oid;
    MyCallable(String oid) { this.oid = oid; }
    @Override public String call() throws Exception {
        return oid + "任務返回的內容";
    }
}

運行結果

>>A任務返回的內容
>>>B任務返回的內容
Process finished with exit code 0

Future 核心方法

  • get():阻塞直到結果就緒
  • get(long timeout, TimeUnit unit):超時獲取,防死等
  • cancel(boolean mayInterruptIfRunning):嘗試取消任務
  • isDone():判斷是否完成
  • isCancelled():判斷是否被取消

進階應用模式

  • 異步計算:主線程提交任務繼續其他工作,稍後 get() 收割結果
  • 批量提交:invokeAll() 等待全部完成,invokeAny() 等待任一完成
  • CompletableFuture (Java 8+):鏈式組合、異步回調、異常處理,功能更強大

注意事項

  • get() 拋出 ExecutionException 包裝任務異常,InterruptedException 當前線程被中斷
  • 及時 shutdown() 線程池,避免資源洩漏
  • 長時間任務考慮超時機制,防止 get() 無限阻塞

出處:https://lavasoft.blog.51cto.com/62575/222082

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved