1. 程式人生 > 其它 >執行緒池-建立方式

執行緒池-建立方式

public class ThreadPoolTest {

    public static void main(String[] args) {
        /**
         *
         * 核心執行緒數量:0
         * 非核心執行緒數量:Integer.MAX_VALUE
         * 佇列:SynchronousQueue
         *
         * 當有大量任務時,就會一直建立執行緒,這樣可能會導致cpu達到100%
         * return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
         *                                       60L, TimeUnit.SECONDS,
         *                                       new SynchronousQueue<Runnable>());
         
*/ ExecutorService executorService = Executors.newCachedThreadPool(); /** * 核心執行緒數量:1 * 非核心執行緒數量: 1-1 = 0 * 佇列:LinkedBlockingQueue (容量為Integer.MAX_VALUE) * * 當有大量任務時,由於執行緒數量固定,來不及處理的任務就會放入佇列(容量大小可視為無限制),這樣可能會導致記憶體溢位 * public LinkedBlockingQueue() { * this(Integer.MAX_VALUE); * } * * return new FinalizableDelegatedExecutorService * (new ThreadPoolExecutor(1, 1, * 0L, TimeUnit.MILLISECONDS, * new LinkedBlockingQueue<Runnable>()));
*/ ExecutorService executorService1 = Executors.newSingleThreadExecutor(); /** * 核心執行緒數量為:nThreads * 非核心執行緒數量為: nThreads-nThreads = 0 * 佇列:LinkedBlockingQueue(容量為Integer.MAX_VALUE) * * 當有大量任務時,由於執行緒數量固定,來不及處理的任務就會放入佇列(容量大小可視為無限制),這樣可能會導致記憶體溢位 * return new ThreadPoolExecutor(nThreads, nThreads, * 0L, TimeUnit.MILLISECONDS, * new LinkedBlockingQueue<Runnable>());
*/ ExecutorService executorService2 = Executors.newFixedThreadPool(10); /** * 自定義執行緒池 * * 核心執行緒數量:10 * 非核心執行緒數量:20 - 10 = 10 * 佇列:ArrayBlockingQueue(容量指定為10) * * 假設當前同時產生50個任務,每個任務需要執行10分鐘(執行緒需要被佔用10分鐘才可以再分配任務)。 * * 先會將1-10任務分配給核心執行緒 * 然後將11-20任務分配給佇列 * 再將21-30任務分配給非核心執行緒 * * 此時,核心執行緒、非核心執行緒、佇列都已經滿了 * 剩下的任務將會被拒絕... * * 分配優先順序:核心執行緒->佇列->非核心執行緒 * 執行優先順序:核心執行緒->非核心執行緒->佇列 */ ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(10, 20, 0, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(10)); } }