ExecutorService線程池submit的使用


有關線程池ExecutorService,只談submit的使用

可創建的類型如下:

private static ExecutorService pool = Executors.newFixedThreadPool(20);//創建一個定長線程池,可控制線程最大並發數,超出的線程會在隊列中等待。

private static ExecutorService pool1 = Executors.newCachedThreadPool();//創建一個可緩存線程池,如果線程池長度超過處理需要,可靈活回收空閑線程,若無可回收,則新建線程。

private static ExecutorService pool2 = Executors.newScheduledThreadPool(20);//創建一個定長線程池,支持定時及周期性任務執行。

private static ExecutorService pool3 = Executors.newSingleThreadExecutor();//創建一個單線程化的線程池,它只會用唯一的工作線程來執行任務,保證所有任務按照指定順序(FIFO, LIFO, 優先級)執行。

在使用多線程時需要每個線程的返回值,了解到自己的類實現Callable接口可以實現,所以就寫了測試用例,但是測試時發現基本都是有序執行。經過多處查證,發現端倪。

1.啟動線程時會返回一個Future對象。

2.可以通過future對象獲取現成的返回值。

3.在執行future.get()時,主線程會堵塞,直至當前future線程返回結果。

也是因為第三點,導致我每次運行都是順序執行。。。。。

說一下submit(Callable<T> task)的用法。

Future<Integer> result = pool.submit(new ThreaTest());會返回一個自定義類型的Future對象。

注意,如果調用result.get()方法,會阻塞主線程,最壞的結果是所有線程順序執行。

程序執行完后記得shutdown。

自己的類implements Callable<Integer>,並重寫call方法,在call方法里完成業務邏輯,並添加返回值。完整代碼如下:

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

public class ThreaTest implements Callable<Integer> {
    private int nowNumber = 0;
    private static ExecutorService pool = Executors.newFixedThreadPool(20);// 創建一個定長線程池,可控制線程最大並發數,超出的線程會在隊列中等待。

    public ThreaTest(int nowNumber) {
        this.nowNumber = nowNumber;
    }

    public static void main(String[] args) {
        ArrayList<Future<Integer>> result = new ArrayList<Future<Integer>>();

        for (int i = 0; i < 5000; i++) {
            Future<Integer> submit = pool.submit(new ThreaTest(i));
            result.add(submit);
        }

        pool.shutdown();
    }

    public Integer call() throws Exception {
        System.out.println(this.nowNumber);
        return this.nowNumber;
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM