使用執行緒池,並發計算1~50、51~100的和,再進⾏匯總統計。

知識點:獲取執行緒池、提交任務、獲取返回值

 

獲取執行緒池的幾種方式:

newFixedThreadPool(int nThreads) 獲取固定數量的執行緒池。參數:指定執行緒池中執行緒的數量。(使用這種)

newCachedThreadPool() 獲得動態數量的執行緒池,如不夠則創建新的,⽆上限。

newSingleThreadExecutor() 創建單個執行緒的執行緒池,只有⼀個執行緒。

newScheduledThreadPool() 創建固定⼤⼩的執行緒池,可以延遲或定時執⾏任務。

 

Callable:jdk1.5之後可以使用Callable來實現執行緒,這個類的call方法具有泛型返回值、可以聲明異常。

Runnable接⼝和Callable接⼝的區別:

Callable接⼝中call⽅法有返回值,Runnable接⼝中run⽅法沒有返回值。

Callable接⼝中call⽅法有聲明異常,Runnable接⼝中run⽅法沒有異常。

 

Future接⼝表示將要執⾏完任務的結果。 get()以阻塞形式等待Future中的非同步處理結果(call()的返回值)。

 

案例1:使⽤兩個執行緒,並發計算1~50、51~100的和,再進⾏匯總統計。

public class TestFuture2 {
    public static void main(String[] args) throws Exception{
        //1創建執行緒池
        ExecutorService es= Executors.newFixedThreadPool(2);
        //2提交任務
        Future<Integer> future1=es.submit(new Callable<Integer>() {
            @Override
            public Integer call() throws Exception {
                int sum=0;
                for(int i=1;i<=50;i++) {
                    sum+=i;
                }
                System.out.println("1-50計算完畢");
                return sum;
            }
        });

        Future<Integer> future2=es.submit(new Callable<Integer>() {
            @Override
            public Integer call() throws Exception {
                int sum=0;
                for(int i=51;i<=100;i++) {
                    sum+=i;
                }
                System.out.println("51-100計算完畢");
                return sum;
            }
        });
        //3獲取結果
        int sum=future1.get()+future2.get();
        System.out.println("結果是:"+sum);
        //4關閉執行緒池
        es.shutdown();
    }
}