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

Java手動配置線程池過程詳解

 更新時間:2020年05月12日 10:55:10   作者:護(hù)花使者  
這篇文章主要介紹了Java手動配置線程池過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

線程池中,常見有涉及到的:

ExecutorService executorService = Executors.newSingleThreadExecutor();
ExecutorService executorService1 = Executors.newCachedThreadPool();
ExecutorService executorService2 = Executors.newFixedThreadPool(3);

關(guān)于Executors和ExecutorService從記憶上類似于Collections和List。

但是以上幾種其實(shí)不建議使用。最好可以通過自己手動配置ThreadPoolExecutor的形式。

我先創(chuàng)建一個demo:

ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
        2,
        5,
        1L,
        TimeUnit.SECONDS,
        new ArrayBlockingQueue<Runnable>(3),
        Executors.defaultThreadFactory(),
        new ThreadPoolExecutor.AbortPolicy()
    );

涉及7個參數(shù),按順序分別是

int corePoolSize, 
int maximumPoolSize, 
long keepAliveTime, 
TimeUnit unit, 
BlockingQueue<Runnable> workQueue, 
ThreadFactory threadFactory, 
RejectedExecutionHandler handler

具體我首先需要結(jié)合參數(shù)解釋下線程池的執(zhí)行原理:

畫了張圖:

如果我用銀行辦理業(yè)務(wù)示例說明如下:

1、首先銀行里面有兩個柜臺,這就是核心線程數(shù)(7大參數(shù)之一)。

2、然后隨著客戶的增加,可能這個兩個柜臺滿了,然后就要請用戶到等候區(qū)里面進(jìn)行等待。這個等候區(qū)就是相當(dāng)于阻塞隊(duì)列(七大參數(shù)之一)。

3、然后緊接著客戶越來越多,連阻塞隊(duì)列都撐不住了,這個時候,就要請求,上面的領(lǐng)導(dǎo)進(jìn)行多增加柜臺的操作,這個時候,可能加了三個柜臺,現(xiàn)在就有5個柜臺了。這個時候最大的線程數(shù)(七大參數(shù)之一)就是5了。

4、但是這個時候可能客戶又越來越多,這個時候新加的柜臺也受不了,就要開始有拒絕策略了(七大參數(shù)之一)

5、然后過了一段時間,慢慢的,客戶越來越少了,這個時候,發(fā)現(xiàn)漸漸的,柜臺空余出來了。KeepAliveTime(七大參數(shù)之一,加上單位,合計(jì)兩個參數(shù))指當(dāng)線程數(shù)大于核心線程數(shù)時,此為終止前多余的空閑線程等待新任務(wù)的最長時間。

6、還有一個參數(shù)是工廠,這個我們不做深入研究,直接用默認(rèn)的工廠即可。

懂得原理以后,我們可以查看下,為什么最好不要直接用,比如:

Executors.newFixedThreadPool(3);

這個的主要原因就是這里面默認(rèn)隊(duì)列的最大值是Integer的最大值。

所以我們生產(chǎn)中需要自己配置線程池。因?yàn)槟J(rèn)隊(duì)列的長度太長了,有可能會導(dǎo)致oom。就是內(nèi)存炸掉了。

這個在阿里的編程思想里面也有說明這一點(diǎn):

這邊我們探討下,拒絕策略。4種策略。就是所有柜臺和等候區(qū)全部滿了。會如何處理。

用非常easy的代碼來過下,這塊的內(nèi)容:

1、AbortPolicy

import java.util.concurrent.*;

public class VolatileTest {
  public static void main(String[] args) throws Exception {
    ExecutorService executorService = new ThreadPoolExecutor(
        2,
        5,
        1L,
        TimeUnit.SECONDS,
        new ArrayBlockingQueue<Runnable>(3),
        Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy()
    );

    try {
      for (int i = 0; i < 9; i++) {
        executorService.execute(new Runnable() {
          @Override
          public void run() {
            System.out.println(Thread.currentThread().getName()+"\t"+"辦理業(yè)務(wù)");
          }
        });
      }
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
    }

  }
}

可以看到如果超出的話直接掛了,阻止正常運(yùn)行。

2、CallerRunsPolicy

輸出

發(fā)現(xiàn)有一個退回main線程,被main線程處理。即會把任務(wù)退回至調(diào)用者。

3、DiscardOldestPolicy

這個將會等待時間最久的任務(wù)丟掉。

4、DiscardPolicy

多出來的任務(wù)會全部丟掉。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot繼承LogStash實(shí)現(xiàn)日志收集的方法示例

    SpringBoot繼承LogStash實(shí)現(xiàn)日志收集的方法示例

    這篇文章主要介紹了SpringBoot繼承LogStash實(shí)現(xiàn)日志收集的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-05-05
  • Java8中List轉(zhuǎn)換String字符串幾種方式

    Java8中List轉(zhuǎn)換String字符串幾種方式

    這篇文章主要給大家介紹了關(guān)于Java8中List轉(zhuǎn)換String字符串的幾種方式,在實(shí)際開發(fā)中經(jīng)常遇到List轉(zhuǎn)為String字符串的情況,文中給出了幾種方法的示例代碼,需要的朋友可以參考下
    2023-07-07
  • Springboot 整合RabbitMq(用心看完這一篇就夠了)

    Springboot 整合RabbitMq(用心看完這一篇就夠了)

    這篇文章主要介紹了Springboot 整合RabbitMq(用心看完這一篇就夠了),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • 詳解Java如何實(shí)現(xiàn)多線程步調(diào)一致

    詳解Java如何實(shí)現(xiàn)多線程步調(diào)一致

    本章節(jié)主要講解另外兩個線程同步器:CountDownLatch和CyclicBarrier的用法,使用場景以及實(shí)現(xiàn)原理,感興趣的小伙伴可以了解一下
    2023-07-07
  • Java后臺生成圖片的完整步驟

    Java后臺生成圖片的完整步驟

    在一些詳情頁面中,可能需要對上傳到服務(wù)器中的圖片生成以縮略圖的形式展示,這篇文章主要給大家介紹了關(guān)于Java后臺生成圖片的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • SpringBoot實(shí)現(xiàn)本地存儲文件上傳及提供HTTP訪問服務(wù)的方法

    SpringBoot實(shí)現(xiàn)本地存儲文件上傳及提供HTTP訪問服務(wù)的方法

    這篇文章主要介紹了SpringBoot實(shí)現(xiàn)本地存儲文件上傳及提供HTTP訪問服務(wù),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • 基于JavaMail API收發(fā)郵件的方法

    基于JavaMail API收發(fā)郵件的方法

    這篇文章主要介紹了基于JavaMail API收發(fā)郵件的方法,實(shí)例分析了javamail的使用方法與相關(guān)注意事項(xiàng),非常具有實(shí)用價值,需要的朋友可以參考下
    2015-07-07
  • 解決Feign切換client到okhttp無法生效的坑(出現(xiàn)原因說明)

    解決Feign切換client到okhttp無法生效的坑(出現(xiàn)原因說明)

    這篇文章主要介紹了解決Feign切換client到okhttp無法生效的坑(出現(xiàn)原因說明),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • 基于maven實(shí)現(xiàn)私服搭建步驟圖解

    基于maven實(shí)現(xiàn)私服搭建步驟圖解

    這篇文章主要介紹了基于maven實(shí)現(xiàn)私服搭建步驟圖解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08
  • Spring Boot之過濾器 Filter注入的方式解析

    Spring Boot之過濾器 Filter注入的方式解析

    這篇文章主要介紹了Spring Boot之過濾器 Filter注入的方式解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11

最新評論

额敏县| 峨边| 临夏县| 西和县| 海城市| 抚远县| 民权县| 宜宾市| 平江县| 阳朔县| 西和县| 平果县| 鲁山县| 通榆县| 阳城县| 峨边| 永清县| 富蕴县| 绿春县| 平舆县| 玉环县| 张家口市| 维西| 施秉县| 天峨县| 乌兰察布市| 龙海市| 九台市| 蒙自县| 公主岭市| 西青区| 吉首市| 桓台县| 日土县| 全椒县| 贡觉县| 兴义市| 偏关县| 济阳县| 水富县| 开原市|