1. 程式人生 > >java多執行緒Future和Callable類的解釋與使用

java多執行緒Future和Callable類的解釋與使用

一,描述

    ​在多執行緒下程式設計的時候,大家可能會遇到一種需求,就是我想在我開啟的執行緒都結束時,同時獲取每個執行緒中返回的資料然後再做統一處理,在這樣的需求下,Future與Callable的組合就派上了很大的用場。也有人會說,我可以使用同步來完成這個需求啊,一般情況下確實可以。但是在一種特殊情況下就不行了:

    ​想象,你開啟了多個執行緒同步計算一些資料,但是大家都知道,執行緒是會爭用資源的,也就是說,你開啟多個執行緒來同步計算資料時,其實執行緒之間的計算順序是不可空的,當然除非你非很大週摺去處理也不無可能,在這種情況下,Future和Callable的組合就是不二之選了。


二,例子

這兩個類的例子其實很簡單,主要就看自己在實際運用中能不能找到他們的用武之地了,上程式碼:

package test;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class FetureCallableTest {
    private static ExecutorService service = Executors.newFixedThreadPool(100);
    private static int count = 1;
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        int sum = 0;
        for(int i = 0; i < 100; i++) {
            Future<Integer> future = service.submit(new Callable<Integer>(){
    
                @Override
                public Integer call() throws Exception {
                    System.out.println(Thread.currentThread().getName());
                    return ++count;
                }
                
            });
            int f = future.get();
            sum += f;
            System.out.println("future is " + f);
        }
        System.out.println("sum is " + sum);
        service.shutdownNow();
    }

}