最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

ThreadPoolExecutor線程池的使用方法

 更新時間:2019年09月25日 08:35:27   作者:灬奔跑的蝸牛灬  
這篇文章主要為大家詳細介紹了ThreadPoolExecutor線程池的使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下

ThreadPoolExecutor

ThreadPoolExecutor線程池,java提供開發(fā)框架,管理線程的創(chuàng)建、銷毀、優(yōu)化、監(jiān)控等。

有4種不同的任務隊列:

1.ArrayBlockingQueue:基于數(shù)組結構的任務隊列。此隊列按先進先出的原則對任務進行排序。

2.LinkedBlockingQueue:基于鏈表結構的任務隊列。此隊列也是按先進先出的原則對任務進行排序。但性能比ArrayBlockingQueue高。

3.synchronousQueue:不存儲元素的任務隊列。每個插入操作必須等到另一個線程調用移除操作,否則插入操作一直處于阻塞狀態(tài)。

4.PriorityBlockingQueue:具有優(yōu)先級的任務隊列。此隊列中的元素必須能夠比較。

拒絕策略:

RejectedExecutionHandler(飽和策略 ):當線程池中的線程數(shù)大于maximumPoolSize時,線程池就不能在處理任何任務了,這時線程池會拋出異常。原因就是這個策略默認情況下是AbortPolicy:表示無法處理新任務時拋出異常。

1.AbortPolicy:直接拋出異常。

2.CallerRunsPolicy:只用調用者所在線程來運行任務。

3.DiscardOldestPolicy:丟棄隊列里最近的一個任務,并執(zhí)行當前任務

4.DiscardPolicy:不處理,丟棄掉。

自定義:

ThreadPoolExecutor.AbortPolicy()
//拋出java.util.concurrent.RejectedExecutionException異常
ThreadPoolExecutor.CallerRunsPolicy()
//重試添加當前的任務,他會自動重復調用execute()方法
ThreadPoolExecutor.DiscardOldestPolicy()
//拋棄舊的任務
ThreadPoolExecutor.DiscardPolicy()
// 拋棄當前的任務

private static class RecjectThreadHandler implements RejectedExecutionHandler
 {
 @Override
 public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {

 }

 // 異常記錄
 private void doLog(Runnable r, ThreadPoolExecutor executor)
 {
  System.out.println(r.toString()+"excutor failed."+executor.getCompletedTaskCount());
 }
 }

創(chuàng)建線程工廠:

用來創(chuàng)建線程。

public class CheckThreadFactory implements ThreadFactory
{
 private String threadGroupName;

 private AtomicInteger count = new AtomicInteger(0);

 public CheckThreadFactory(String threadGroupName) {
 this.threadGroupName = threadGroupName;
 }

 @Override
 public Thread newThread(Runnable r)
 {
 Thread thread = new Thread(r);
 thread.setName(threadGroupName+"--"+count.addAndGet(1));
 thread.setPriority(5);
 thread.setDaemon(true);.// 設置為守護線程, 默認為主線程
 return thread;
 }
}

線程工具類:

/**
 * @author Donald
 * @create 2019-09-21 21:40
 */
public class CheckExcetPool
{
 // 線程池核心線程數(shù)
 private static int corePoolSize = Runtime.getRuntime().availableProcessors() * 5;
 // 最大線程數(shù)
 private static int maximumPoolSize = corePoolSize > 255 ? 255 : corePoolSize * 2;
 // 線程池中除了核心線程,其他線程的最大存活時間
 private static int keepAliveTime = 60;
 // 時間單位
 private static TimeUnit timeUnit = TimeUnit.SECONDS;
 // 線程等待隊列
 private static BlockingQueue queue = new LinkedBlockingQueue();
 //private static BlockingQueue queue = new ArrayBlockingQueue<Runnable>(30);
 // 創(chuàng)建線程的工廠
 private static CheckThreadFactory checkThreadFactory = new CheckThreadFactory("checkGroup");
 // 拒絕策略 當提交任務數(shù)超過maxmumPoolSize+workQueue之和時,
 // * 即當提交第41個任務時(前面線程都沒有執(zhí)行完,此測試方法中用sleep(100)),
 // *   任務會交給RejectedExecutionHandler來處理
 /*handler的拒絕策略:
 有四種:第一種AbortPolicy:不執(zhí)行新任務,直接拋出異常,提示線程池已滿
 第二種DisCardPolicy:不執(zhí)行新任務,也不拋出異常
 第三種DisCardOldSetPolicy:將消息隊列中的第一個任務替換為當前新進來的任務執(zhí)行
 第四種CallerRunsPolicy:直接調用execute來執(zhí)行當前任務*/

 private static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
  corePoolSize,
  maximumPoolSize,
  keepAliveTime,
  timeUnit,
  queue,
  checkThreadFactory
 );

 public static void submit( Runnable runnable)
 {
 System.out.println(corePoolSize+"::"+queue.size());
 threadPoolExecutor.submit(runnable);
 }
 public static <T> Future submit(Callable<T> callable)
 {
 return threadPoolExecutor.submit(callable);
 }
 public static <T> void excutor( Runnable run, T result )
 {
 threadPoolExecutor.submit( run,result );
 }
 public static void excutor( Runnable run)
 {
 threadPoolExecutor.execute( run);
 }

 private static class RecjectThreadHandler implements RejectedExecutionHandler
 {
 @Override
 public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {

 }

 // 異常記錄
 private void doLog(Runnable r, ThreadPoolExecutor executor)
 {
  System.out.println(r.toString()+"excutor failed."+executor.getCompletedTaskCount());
 }
 }
}

線程服務類,實現(xiàn)runnable 接口:

/**
 * @author Donald
 * @create 2019-09-21 23:00
 */
public class ThreadService implements Runnable
{
 private CountDownLatch countDownLatch;
 private UserInterface userInterface;

 public ThreadService(CountDownLatch countDownLatch, UserInterface userInterface) {
 this.countDownLatch = countDownLatch;
 this.userInterface = userInterface;
 }

 @Override
 public void run()
 {
 try {
  long start = System.currentTimeMillis();
  userInterface.doSomething();
  System.err.println(String.format("user time :%s",System.currentTimeMillis()-start));
  Thread.sleep(1000);
 }catch ( Exception e)
 {
  e.printStackTrace();
 }finally {
  countDownLatch.countDown();
 }
 }
}

具體業(yè)務邏輯:

/**
 * @author Donald
 * @create 2019-09-21 22:51
 */
public interface UserInterface
{
 void doSomething();
}

業(yè)務類:

/**
 * @author Donald
 * @create 2019-09-21 22:51
 */
public class UserService implements UserInterface
{
 private int number;

 public UserService(int number) {
 this.number = number;
 }

 @Override
 public void doSomething() {
 System.out.println(Thread.currentThread().getName()+"<<<<"+number);
 }

}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • java利用JEXL實現(xiàn)動態(tài)表達式編譯

    java利用JEXL實現(xiàn)動態(tài)表達式編譯

    這篇文章主要介紹了java利用JEXL實現(xiàn)動態(tài)表達式編譯,系統(tǒng)要獲取多個數(shù)據(jù)源的數(shù)據(jù),并進行處理,最后輸出多個字段。字段的計算規(guī)則一般是簡單的取值最多加一點條件判斷,下面是具體的實現(xiàn)方法
    2021-04-04
  • Java進程cpu占用過高問題解決

    Java進程cpu占用過高問題解決

    這篇文章主要介紹了Java進程cpu占用過高問題解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04
  • maven加入spring框架的詳細教程

    maven加入spring框架的詳細教程

    這篇文章主要介紹了maven加入spring框架的詳細教程,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • JAVA線程池監(jiān)控以及動態(tài)調整示例詳解

    JAVA線程池監(jiān)控以及動態(tài)調整示例詳解

    這篇文章主要為大家介紹了JAVA線程池監(jiān)控以及動態(tài)調整示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • java解析xml之dom4j解析xml示例分享

    java解析xml之dom4j解析xml示例分享

    DOM4J具有性能優(yōu)異、功能強大和極端易用使用的特點,只要懂得DOM基本概念,就可以通過dom4j的api文檔來解析xml,dom4j是一套開源的api。實際項目中,往往選擇dom4j來作為解析xml的利器
    2014-01-01
  • MapTask工作機制圖文詳解

    MapTask工作機制圖文詳解

    今天小編就為大家分享一篇關于MapTask工作機制圖文詳解,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • Spring Cloud Alibaba和Dubbo融合實現(xiàn)

    Spring Cloud Alibaba和Dubbo融合實現(xiàn)

    這篇文章主要介紹了Spring Cloud Alibaba和Dubbo融合實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04
  • Java并發(fā)編程中的阻塞隊列解析

    Java并發(fā)編程中的阻塞隊列解析

    這篇文章主要介紹了Java并發(fā)編程中的阻塞隊列解析,阻塞隊列BlockingQueue是一個支持兩個附加操作的隊列,這兩個附加的操作是在隊列為空時,獲取元素的線程會等待隊列變?yōu)榉强?當隊列滿時,存儲元素的線程會等待隊列可用,需要的朋友可以參考下
    2023-08-08
  • MyBatis使用標簽動態(tài)操作數(shù)據(jù)庫詳解

    MyBatis使用標簽動態(tài)操作數(shù)據(jù)庫詳解

    這篇文章主要介紹了MyBatis中使用標簽動態(tài)操作數(shù)據(jù)庫的方法,動態(tài)SQL是指在運行PL/SQL塊時動態(tài)輸入SQL語句,是Mybatis的強大特性之?,能夠完成不同條件下不同的sql拼接,需要的朋友可以參考下
    2024-05-05
  • 詳解Java高并發(fā)編程之AtomicReference

    詳解Java高并發(fā)編程之AtomicReference

    此篇文章主要介紹了AtomicReference的出現(xiàn)背景,AtomicReference的使用場景,以及介紹了AtomicReference的源碼,重點方法的源碼分析
    2021-06-06

最新評論

咸丰县| 潞西市| 外汇| 东辽县| 牙克石市| 天长市| 南陵县| 墨玉县| 舟曲县| 隆回县| 类乌齐县| 华宁县| 宿迁市| 如皋市| 习水县| 青海省| 静乐县| 竹溪县| 鲁甸县| 大竹县| 会昌县| 青海省| 唐山市| 芜湖市| 伊宁县| 美姑县| 五指山市| 汶川县| 华坪县| 扎鲁特旗| 桃园市| 竹北市| 长春市| 全州县| 偏关县| 屏山县| 昂仁县| 浙江省| 易门县| 德令哈市| 灵石县|