有關線程池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; } }