自定義線程池和拒絕策略的使用



import java.util.concurrent.*;

/**          |-> 小於corePoolSize -> 分配線程執行
 * 任務提交-> |                                      |->成功->等待執行
 *           |-> 大於corePoolSize -> 提交到等待隊列 ->|                   |->達到maximumPoolSize線程,提交失敗->拒絕執行
 *                                                  |->失敗->提交線程池->|
 *                                                                     |->未達到,提交成功->分配線程執行
 *
 *  自定義線程池和拒絕策略的使用
 */
public class RejectThreadPoolDemo {
    public static class MyTask implements Runnable{
        @Override
        public void run() {
            System.out.println(System.currentTimeMillis()+" Id:"+Thread.currentThread().getId());
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    public static void main(String[] args) throws InterruptedException{
        MyTask task = new MyTask();
        /**
         *  public ThreadPoolExecutor(int corePoolSize, //指定線程池中線程數量
         *                               int maximumPoolSize, //指定線程池中的最大線程數量
         *                               long keepAliveTime, //超過corePoolSize的空閑線程,在多長時間內會被銷毀
         *                               TimeUnit unit, //keepAliveTime的單位
         *                               BlockingQueue<Runnable> workQueue,//任務隊列
         *                               ThreadFactory threadFactory,//線程工廠,一般默認即可
         *                               RejectedExecutionHandler handler) {//拒絕策略,當任務太多來不及處理,如何拒絕任務
         */
        ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 5, 0L,
                TimeUnit.MILLISECONDS, new LinkedBlockingDeque<>(10),
                Executors.defaultThreadFactory(), new RejectedExecutionHandler() {
            @Override
            public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { //r:請求執行的任務  executor:當前的線程池
                //打印丟失的任務
                System.out.println(r.toString() + " is discard");
            }
        });
        for (int i = 0; i < Integer.MAX_VALUE; i++) {
            executor.submit(task);
            Thread.sleep(10);
        }
    }
    //1567644472625 Id:9
    //1567644472631 Id:10
    //1567644472646 Id:11
    //1567644472654 Id:12
    //1567644472665 Id:13
    //java.util.concurrent.FutureTask@60e53b93 is discard
    //java.util.concurrent.FutureTask@5e2de80c is discard
    //。。。
}


免責聲明!

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



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