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

Java多線程ThreadPoolExecutor詳解

 更新時(shí)間:2022年08月12日 14:45:12   作者:七國的天下,我要九十九  
這篇文章主要介紹了Java多線程ThreadPoolExecutor詳解,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下

前言:

根據(jù)ThreadPoolExecutor的構(gòu)造方法,JDK提供了很多工廠方法來創(chuàng)建各種用途的線程池.

1 newFixedThreadPool

public static ExecutorService newFixedThreadPool(int nThreads) {
 return new ThreadPoolExecutor(nThreads, nThreads,
 0L, TimeUnit.MILLISECONDS,
 new LinkedBlockingQueue<Runnable>());
}

說明:

  • 核心線程數(shù) == 最大線程數(shù)(沒有救急線程被創(chuàng)建),因此也無需超時(shí)時(shí)間
  • 阻塞隊(duì)列是無界的,可以放任意數(shù)量的任務(wù)(最大為Integer.MAX_VALUE)

適用于 任務(wù)量一已知,相對(duì)耗時(shí)的任務(wù)

2 newCachedThreadPool

public static ExecutorService newCachedThreadPool() {
 return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
 60L, TimeUnit.SECONDS,
 new SynchronousQueue<Runnable>());
}

說明:

  • 核心線程數(shù)是 0, 最大線程數(shù)是 Integer.MAX_VALUE,救急線程的空閑生存時(shí)間是 60s
    • 全部都是救急線程(60s 后可以回收)
    • 救急線程可以無限創(chuàng)建(最大是Integer.MAX_VALUE)
  • 隊(duì)列采用了 SynchronousQueue 實(shí)現(xiàn)特點(diǎn)是,它沒有容量,沒有線程來取是放不進(jìn)去的(一手交錢、一手交 貨)

如下案例:

SynchronousQueue<Integer> integers = new SynchronousQueue<>();
new Thread(() -> {
     try {
         log.debug("putting {} ", 1);
         integers.put(1);
         log.debug("{} putted...", 1);
         log.debug("putting...{} ", 2);
         integers.put(2);
         log.debug("{} putted...", 2);
     } catch (InterruptedException e) {
         e.printStackTrace();
     }
},"t1").start();
sleep(1);
new Thread(() -> {
     try {
         log.debug("taking {}", 1);
         integers.take();
     } catch (InterruptedException e) {
         e.printStackTrace();
     }
},"t2").start();
sleep(1);
new Thread(() -> {
     try {
         log.debug("taking {}", 2);
         integers.take();
     } catch (InterruptedException e) {
         e.printStackTrace();
     }
},"t3").start();
/*
運(yùn)行結(jié)果:
11:48:15.500 c.TestSynchronousQueue [t1] - putting 1 
11:48:16.500 c.TestSynchronousQueue [t2] - taking 1 
11:48:16.500 c.TestSynchronousQueue [t1] - 1 putted... 
11:48:16.500 c.TestSynchronousQueue [t1] - putting...2 
11:48:17.502 c.TestSynchronousQueue [t3] - taking 2 
11:48:17.503 c.TestSynchronousQueue [t1] - 2 putted... 
*/

整個(gè)線程池表現(xiàn)為線程數(shù)會(huì)根據(jù)任務(wù)量不斷增長(zhǎng),沒有上限,當(dāng)任務(wù)執(zhí)行完畢,空閑 1分鐘后釋放線程。

適用于 任務(wù)數(shù)比較密集,但每個(gè)任務(wù)執(zhí)行時(shí)間較短的情況

3 newSingleThreadExecutor

public static ExecutorService newSingleThreadExecutor() {
 return new FinalizableDelegatedExecutorService
 (new ThreadPoolExecutor(1, 1,
 0L, TimeUnit.MILLISECONDS,
 new LinkedBlockingQueue<Runnable>()));
}

希望多個(gè)任務(wù)排隊(duì)執(zhí)行。線程數(shù)固定為 1,任務(wù)數(shù)多于 1 時(shí),會(huì)放入無界隊(duì)列排隊(duì)。任務(wù)執(zhí)行完畢,這唯一的線程也不會(huì)被釋放.

與其他線程區(qū)別:

  • 自己創(chuàng)建一個(gè)單線程串行執(zhí)行任務(wù),如果任務(wù)執(zhí)行失敗而終止那么沒有任何補(bǔ)救措施,而線程池還會(huì)新建一 個(gè)線程,保證池的正常工作
  • Executors.newSingleThreadExecutor() 線程個(gè)數(shù)始終為1,不能修改
    • FinalizableDelegatedExecutorService 應(yīng)用的是裝飾器模式,只對(duì)外暴露了 ExecutorService 接口,因此不能調(diào)用 ThreadPoolExecutor 中特有的方法.
  • Executors.newFixedThreadPool(1) 初始時(shí)為1,以后還可以修改
    • 對(duì)外暴露的是 ThreadPoolExecutor 對(duì)象,可以強(qiáng)轉(zhuǎn)后調(diào)用 setCorePoolSize 等方法進(jìn)行修改

4 提交任務(wù)

// 執(zhí)行任務(wù)
void execute(Runnable command);
// 提交任務(wù) task,用返回值 Future 獲得任務(wù)執(zhí)行結(jié)果
<T> Future<T> submit(Callable<T> task);
// 提交 tasks 中所有任務(wù)
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
 throws InterruptedException;
// 提交 tasks 中所有任務(wù),帶超時(shí)時(shí)間
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks,
 long timeout, TimeUnit unit)
 throws InterruptedException;
// 提交 tasks 中所有任務(wù),哪個(gè)任務(wù)先成功執(zhí)行完畢,返回此任務(wù)執(zhí)行結(jié)果,其它任務(wù)取消
<T> T invokeAny(Collection<? extends Callable<T>> tasks)
 throws InterruptedException, ExecutionException;

// 提交 tasks 中所有任務(wù),哪個(gè)任務(wù)先成功執(zhí)行完畢,返回此任務(wù)執(zhí)行結(jié)果,其它任務(wù)取消,帶超時(shí)時(shí)間
<T> T invokeAny(Collection<? extends Callable<T>> tasks,
 long timeout, TimeUnit unit)
 throws InterruptedException, ExecutionException, TimeoutException;

上述都是提供的提交任務(wù)的方法,根據(jù)不同的業(yè)務(wù)場(chǎng)景需求,選擇對(duì)應(yīng)的提交方法.

5 關(guān)閉線程池

shutdown

/*
線程池狀態(tài)變?yōu)?SHUTDOWN
- 不會(huì)接收新任務(wù)
- 但已提交任務(wù)會(huì)執(zhí)行完
- 此方法不會(huì)阻塞調(diào)用線程的執(zhí)行
*/
void shutdown();
public void shutdown() {
     final ReentrantLock mainLock = this.mainLock;
     mainLock.lock();
     try {
     checkShutdownAccess();
     // 修改線程池狀態(tài)
     advanceRunState(SHUTDOWN);
     // 僅會(huì)打斷空閑線程
     interruptIdleWorkers();
     onShutdown(); // 擴(kuò)展點(diǎn) ScheduledThreadPoolExecutor
     } finally {
     mainLock.unlock();
     }
     // 嘗試終結(jié)(沒有運(yùn)行的線程可以立刻終結(jié),如果還有運(yùn)行的線程也不會(huì)等)
     tryTerminate();
}

shutdownNow

/*
線程池狀態(tài)變?yōu)?STOP
- 不會(huì)接收新任務(wù)
- 會(huì)將隊(duì)列中的任務(wù)返回
- 并用 interrupt 的方式中斷正在執(zhí)行的任務(wù)
*/
List<Runnable> shutdownNow();
public List<Runnable> shutdownNow() {
     List<Runnable> tasks;
     final ReentrantLock mainLock = this.mainLock;
     mainLock.lock();
     try {
     checkShutdownAccess();
     // 修改線程池狀態(tài)
     advanceRunState(STOP);
     // 打斷所有線程
     interruptWorkers();
     // 獲取隊(duì)列中剩余任務(wù)
     tasks = drainQueue();
     } finally {
     mainLock.unlock();
     }
     // 嘗試終結(jié)
     tryTerminate();
     return tasks;
}

其他打斷方法

// 不在 RUNNING 狀態(tài)的線程池,此方法就返回 true
boolean isShutdown();
// 線程池狀態(tài)是否是 TERMINATED
boolean isTerminated();
// 調(diào)用 shutdown 后,由于調(diào)用線程并不會(huì)等待所有任務(wù)運(yùn)行結(jié)束,因此如果它想在線程池 TERMINATED 后做些事
情,可以利用此方法等待
boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException;

到此這篇關(guān)于Java多線程ThreadPoolExecutor詳解的文章就介紹到這了,更多相關(guān)Java ThreadPoolExecutor內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java超過long類型的數(shù)據(jù)表示方法

    Java超過long類型的數(shù)據(jù)表示方法

    這篇文章主要給大家介紹Java超過long類型的數(shù)據(jù)如何表示,在 Java 中,如果需要表示超過 long 類型范圍的數(shù)據(jù),可以使用 BigInteger 類,BigInteger 是 Java 提供的一個(gè)用于處理任意精度整數(shù)的類,它可以表示非常大或非常小的整數(shù),需要的朋友可以參考下
    2023-09-09
  • SpringBoot中使用MyBatis詳細(xì)指南

    SpringBoot中使用MyBatis詳細(xì)指南

    MyBatis 是一款優(yōu)秀的持久層框架,它支持定制化 SQL、存儲(chǔ)過程以及高級(jí)映射,將 Spring Boot 和 MyBatis 集成,能夠充分發(fā)揮 Spring Boot 的快速開發(fā)特性和 MyBatis 靈活的數(shù)據(jù)庫操作能力,本文給大家介紹了SpringBoot使用MyBatis詳細(xì)指南,需要的朋友可以參考下
    2025-01-01
  • MyBatis 核心配置文件及映射文件詳解

    MyBatis 核心配置文件及映射文件詳解

    MyBatis是支持定制化SQL、存儲(chǔ)過程以及高級(jí)映射的優(yōu)秀的持久層框架,本文重點(diǎn)介紹MyBatis 核心配置文件及映射文件,需要的朋友可以參考下
    2023-01-01
  • Java throw Exception實(shí)現(xiàn)異常轉(zhuǎn)換

    Java throw Exception實(shí)現(xiàn)異常轉(zhuǎn)換

    這篇文章主要介紹了Java throw Exception實(shí)現(xiàn)異常轉(zhuǎn)換,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • 關(guān)于Rabbitmq死信隊(duì)列及延時(shí)隊(duì)列的實(shí)現(xiàn)

    關(guān)于Rabbitmq死信隊(duì)列及延時(shí)隊(duì)列的實(shí)現(xiàn)

    這篇文章主要介紹了關(guān)于Rabbitmq死信隊(duì)列及延時(shí)隊(duì)列的實(shí)現(xiàn),TTL就是消息或者隊(duì)列的過期功能,當(dāng)消息過期就會(huì)進(jìn)到死信隊(duì)列,死信隊(duì)列和普通隊(duì)列沒啥區(qū)別,然后我們只需要配置一個(gè)消費(fèi)者來消費(fèi)死信隊(duì)列里面的消息就可以了,需要的朋友可以參考下
    2023-08-08
  • java 并發(fā)編程之共享變量的實(shí)現(xiàn)方法

    java 并發(fā)編程之共享變量的實(shí)現(xiàn)方法

    這篇文章主要介紹了java 并發(fā)編程之共享變量的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Spring?Cloud?Alibaba負(fù)載均衡實(shí)現(xiàn)方式

    Spring?Cloud?Alibaba負(fù)載均衡實(shí)現(xiàn)方式

    這篇文章主要為大家介紹了Spring?Cloud?Alibaba負(fù)載均衡實(shí)現(xiàn)方式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • IDEA不能生成SerialVersionUID,alt+enter不提示沒有效果問題

    IDEA不能生成SerialVersionUID,alt+enter不提示沒有效果問題

    文章介紹了在使用IntelliJ IDEA時(shí),通過安裝AutoFillingJavaCallArguments插件并導(dǎo)入Serializable接口后,遇到無法自動(dòng)生成序列ID的問題,解決方法是在設(shè)置中搜索serial,勾選“不帶'serialVersionUID'的可序列化類”選項(xiàng)
    2025-01-01
  • java設(shè)計(jì)模式之外觀模式學(xué)習(xí)筆記

    java設(shè)計(jì)模式之外觀模式學(xué)習(xí)筆記

    這篇文章主要為大家詳細(xì)介紹了java設(shè)計(jì)模式之外觀模式學(xué)習(xí)筆記,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • DolphinScheduler容錯(cuò)Master源碼分析

    DolphinScheduler容錯(cuò)Master源碼分析

    這篇文章主要為大家介紹了DolphinScheduler容錯(cuò)Master源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02

最新評(píng)論

澎湖县| 甘德县| 江北区| 泌阳县| 建瓯市| 南宁市| 九寨沟县| 镇安县| 大英县| 南阳市| 嘉祥县| 永康市| 华阴市| 菏泽市| 韶山市| 牙克石市| 邛崃市| 安溪县| 佛坪县| 凤城市| 曲靖市| 磐安县| 永新县| 庆阳市| 五常市| 高青县| 仁寿县| 荔波县| 和硕县| 宜川县| 鹿泉市| 辉县市| 阿荣旗| 泽普县| 乌苏市| 平远县| 金溪县| 闽清县| 常熟市| 定边县| 平定县|