線程池及拒絕策略的基本使用

package com.xiangshuai.test;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * 文件在 E:(我的網盤\我的筆記)\學習文檔子目錄壓縮\併發技術\J2SE多線程基礎\線程池\線程池及拒絕策略的基本使用\Thread6Demo.java
 * @author lqx
 * 線程池的使用,只有定長的線程池纔有必要做一些
 * 核心線程數,最大線程數,設置ArrayBlockingQueue這種有界隊列,
 * 以及當隊列滿了後繼續創建最大線程數又滿了後,
 * new ThreadPoolExecutor.設置拒絕策略
 * 拒絕策略提供頂級接口 RejectedExecutionHandler ,其中方法 rejectedExecution 即定製具體的拒絕策略的執行邏輯。

jdk默認提供了四種拒絕策略:CallerRunsPolicy - 當觸發拒絕策略,只要線程池沒有關閉的話,則使用調用線程直接運行任務。

一般併發比較小,性能要求不高,不允許失敗。但是,由於調用者自己運行任務,如果任務提交速度過快,可能導致程序阻塞,性能效率上必然的損失較大

AbortPolicy - 丟棄任務,並拋出拒絕執行 RejectedExecutionException 異常信息。線程池默認的拒絕策略。必須處理好拋出的異常,否則會打斷當前的執行流程,影響後續的任務執行。

 DiscardPolicy - 直接丟棄,其他啥都沒有

DiscardOldestPolicy - 當觸發拒絕策略,只要線程池沒有關閉的話,丟棄阻塞隊列 workQueue 中最老的一個任務,並將新任務加入
 * */
public class Thread6Demo {
     public static int count=1;
    
    public static void main(String[] args) throws InterruptedException  {
        ThreadPoolExecutor tpool = new ThreadPoolExecutor(3, 5, 60, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(8), new ThreadPoolExecutor.CallerRunsPolicy());
         for(int i=0;i<19;i++){
             try {
                 tpool.execute(new Threadt());
            } catch (Exception e) {
                e.printStackTrace();
                System.out.println("出現異常"+count++);
            }
            
             
         }
         
    }
}


class Threadt implements Runnable{

    @Override
    public void run() {
        
        System.out.println(Thread.currentThread().getName()+"--"+Thread6Demo.count++);
         try {
             Thread.sleep(9000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    }
    
}
 

發佈了162 篇原創文章 · 獲贊 11 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章