線程池的4種拒絕策略


new ThreadPoolExecutor(corePoolSize,maximumPoolSize,keepAliveTime,unit,workQueue,new ThreadPoolExecutor.AbortPolicy())

1.ThreadPoolExecutor.AbortPolicy

線程池的默認拒絕策略為AbortPolicy,即丟棄任務並拋出RejectedExecutionException異常(即后面提交的請求不會放入隊列也不會直接消費並拋出異常);

2.ThreadPoolExecutor.DiscardPolicy

丟棄任務,但是不拋出異常。如果線程隊列已滿,則后續提交的任務都會被丟棄,且是靜默丟棄(也不會拋出任何異常,任務直接就丟棄了)。

3.ThreadPoolExecutor.DiscardOldestPolicy

丟棄隊列最前面的任務,然后重新提交被拒絕的任務(丟棄掉了隊列最前的任務,並不拋出異常,直接丟棄了)。

4.ThreadPoolExecutor.CallerRunsPolicy

由調用線程處理該任務(不會丟棄任務,最后所有的任務都執行了,並不會拋出異常)

 

使用最好使用默認的拒絕策略。

 

測試代碼:

 

public class MainTest {
    public static void main(String[] args) {
        //核心線程數
        int corePoolSize = 3;
        //最大線程數
        int maximumPoolSize = 6;
        //超過 corePoolSize 線程數量的線程最大空閑時間
        long keepAliveTime = 2;
        //以秒為時間單位
        TimeUnit unit = TimeUnit.SECONDS;
        //創建工作隊列,用於存放提交的等待執行任務
        BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<Runnable>(2);
        ThreadPoolExecutor threadPoolExecutor = null;
        try {

            //Executors.
            //創建線程池
            threadPoolExecutor = new ThreadPoolExecutor(corePoolSize,
                    maximumPoolSize,
                    keepAliveTime,
                    unit,
                    workQueue,
                    new ThreadPoolExecutor.CallerRunsPolicy());

            //循環提交任務
            for (int i = 0; i < 12; i++) {
                //提交任務的索引
                final int index = (i + 1);
                threadPoolExecutor.submit(() -> {
                    //線程打印輸出
                    System.out.println("大家好,我是線程:" + index);
                    try {
                        //模擬線程執行時間,10s
                        Thread.sleep(10000);
                        
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                });
                //每個任務提交后休眠500ms再提交下一個任務,用於保證提交順序
                Thread.sleep(500);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            threadPoolExecutor.shutdown();
        }
    }

}

 

  

 


免責聲明!

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



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