日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java Review - 线程池资源一直不被释放案例源码分析

發布時間:2025/3/21 java 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java Review - 线程池资源一直不被释放案例源码分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 概述
  • 問題復現
  • 源碼分析
  • 小結

概述

在日常開發中為了便于線程的有效復用,經常會用到線程池,然而使用完線程池后如果不調用shutdown關閉線程池,則會導致線程池資源一直不被釋放。

下面通過簡單的例子來說明該問題。


問題復現

下面通過一個例子說明如果不調用線程池對象的shutdown方法關閉線程池,則當線程池里面的任務執行完畢并且主線程已經退出后,JVM仍然存在。

import java.util.concurrent.*;/*** @author 小工匠* @version 1.0* @description: TODO* @date 2021/11/20 23:33* @mark: show me the code , change the world*/ public class PoolShutDownTest {public static void main(String[] args) {// 異步執行業務1ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(5, 10, 10,TimeUnit.MINUTES, new LinkedBlockingDeque<>(100));threadPoolExecutor.execute(()->{try {TimeUnit.SECONDS.sleep(3);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("業務1----模擬業務");});// 異步執行業務2ExecutorService executorService = Executors.newSingleThreadExecutor();executorService.execute(()->System.out.println("業務2"));// 業務執行完成System.out.println("executor over");} }

在如上代碼的主線程里面,首先 執行了異步業務, 使用線程池的一個線程執行異步操作,我們期望當主線程與異步業務執行完線程池里面的任務后整個JVM就會退出,但是執行結果卻如下所示。

左上的方塊說明JVM進程還沒有退出 ,這是什么情況呢?修改代碼代碼,在方法里面添加調用線程池的shutdown方法的代碼。

再次執行代碼你會發現JVM已經退出了,使用ps -eaf|grep java命令查看,發現Java進程已經不存在了,這說明只有調用了線程池的shutdown方法后,線程池任務執行完畢,線程池資源才會被釋放。


源碼分析

下面看為何會如此?大家或許還記得守護線程與用戶線程,JVM退出的條件是當前不存在用戶線程,而線程池默認的ThreadFactory創建的線程是用戶線程


由如上代碼可知,線程池默認的ThreadFactory創建的都是用戶線程。而線程池里面的核心線程是一直存在的,如果沒有任務則會被阻塞,所以線程池里面的用戶線程一直存在。而shutdown方法的作用就是讓這些核心線程終止.

下面簡單看下shutdown的主要代碼。

/*** Initiates an orderly shutdown in which previously submitted* tasks are executed, but no new tasks will be accepted.* Invocation has no additional effect if already shut down.** <p>This method does not wait for previously submitted tasks to* complete execution. Use {@link #awaitTermination awaitTermination}* to do that.** @throws SecurityException {@inheritDoc}*/public void shutdown() {final ReentrantLock mainLock = this.mainLock;mainLock.lock();try {checkShutdownAccess();// 設置線程池狀態為SHUTDOWNadvanceRunState(SHUTDOWN);// 中斷所有的空閑工作線程interruptIdleWorkers();onShutdown(); // hook for ScheduledThreadPoolExecutor} finally {mainLock.unlock();}tryTerminate();}

這里在shutdown方法里面設置了線程池的狀態為SHUTDOWN,并且設置了所有Worker空閑線程(阻塞到隊列的take()方法的線程)的中斷標志。

/*** Transitions runState to given target, or leaves it alone if* already at least the given target.** @param targetState the desired state, either SHUTDOWN or STOP* (but not TIDYING or TERMINATED -- use tryTerminate for that)*/private void advanceRunState(int targetState) {for (;;) {int c = ctl.get();if (runStateAtLeast(c, targetState) ||ctl.compareAndSet(c, ctlOf(targetState, workerCountOf(c))))break;}}

那么下面來看在工作線程Worker里面是不是設置了中斷標志,然后它就會退出。

final void runWorker(Worker w) {.......try {while (task != null || (task = getTask()) != null) {....... } finally {.......}} private Runnable getTask() {boolean timedOut = false; // Did the last poll() time out?for (;;) {....// Check if queue empty only if necessary.// 代碼1 if (rs >= SHUTDOWN && (rs >= STOP || workQueue.isEmpty())) {decrementWorkerCount();return null;}try {// 代碼2Runnable r = timed ?workQueue.poll(keepAliveTime, TimeUnit.NANOSECONDS) :workQueue.take();if (r != null)return r;timedOut = true;} catch (InterruptedException retry) {timedOut = false;}}}

在如上代碼中,在正常情況下如果隊列里面沒有任務,則工作線程被阻塞到代碼(2)等待從工作隊列里面獲取一個任務。

這時候如果調用線程池的shutdown命令(shutdown命令會中斷所有工作線程),則代碼(2)會拋出InterruptedException異常而返回,而這個異常被捕捉到了,所以繼續執行代碼(1),而執行shutdown時設置了線程池的狀態為SHUTDOWN,所以getTask方法返回了null,因而runWorker方法退出循環,該工作線程就退出了


小結

我們這里通過一個簡單的使用線程池異步執行任務的案例介紹了使用完線程池后如果不調用shutdown方法,則會導致線程池的線程資源一直不會被釋放,并通過源碼分析了沒有被釋放的原因。

所以在日常開發中使用線程池后一定不要忘記調用shutdown方法關閉。

總結

以上是生活随笔為你收集整理的Java Review - 线程池资源一直不被释放案例源码分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产精品久久久久久久久毛片 | 亚洲乱码国产乱码精品 | 在线观看黄 | 夜夜春视频 | 亚洲好看站 | 国产精品毛片一区视频播 | av色欲无码人妻中文字幕 | 妖精视频污 | 久久精品3 | 黄色午夜网站 | 美女尻逼视频 | 国内精品视频一区 | 国产精品福利一区二区三区 | 男人肌肌桶女人肌肌 | а√天堂中文在线资源8 | 日韩深夜视频 | 干欧美少妇 | 夜夜爽天天爽 | 黄色片高清| 韩国av网| 国产精品亚洲αv天堂无码 伊人性视频 | 午夜做爰xxxⅹ性高湖视频美国 | 欧美a级成人淫片免费看 | 日本美女黄色 | 调教驯服丰满美艳麻麻在线视频 | 色综合综合色 | 黄色福利| 中文字幕乱码无码人妻系列蜜桃 | 欧美激情精品久久久久久变态 | 久久久国产成人 | 欧美精品一区二区三区久久久 | 人人人爽| 亚洲综合图片一区 | 美女日批网站 | 一区二区三区精品免费视频 | 久久二| 日韩在线影视 | 久久综合婷婷国产二区高清 | 午夜18视频在线观看 | 国产一区二区三区 | 一级片视频免费观看 | 午夜中文字幕 | 91av国产精品| 肥老熟妇伦子伦456视频 | 你懂的在线视频网站 | 主播一区二区 | 正在播放经典国语对白 | 不用播放器看av | 国产一区二区视频免费观看 | 天堂亚洲网 | 91ts人妖另类精品系列 | 女人被男人躁得好爽免费视频 | 国产精品传媒视频 | av影视天堂 | exo妈妈mv在线播放高清免费 | 国产精品一卡二卡 | 特一级黄色大片 | 精品福利电影 | 69xx视频在线观看 | 在线观看日本一区二区 | 午夜寂寞院 | 男女野外做受全过程 | 一级片播放 | 亚洲性欧美色 | 日韩av在线看免费观看 | 国产精品亚洲一区二区三区 | 一级黄色av片 | 成人网在线免费观看 | 大陆av片 | 91在线精品播放 | 亚洲中字| 国产精品麻豆成人av电影艾秋 | 国产成人久久精品流白浆 | 欧美成人一区二区三区 | 亚洲AV综合色区国产精品天天 | 97色伦97色伦国产欧美空 | 可以直接看av的网址 | 欧美成人国产精品高潮 | 色性av | 福利影院在线 | 欧美性猛交xxx乱久交 | www.激情五月.com | 秋霞啪啪片 | 一区二区成人在线 | www在线播放| 解开人妻的裙子猛烈进入 | av大片在线免费观看 | 午夜一区二区三区四区 | 国产成人啪精品 | 拍真实国产伦偷精品 | wwwwxxx日本 | 美女扒开尿口给男人看 | 亚洲午夜精品一区二区三区 | 色屁屁ts人妖系列二区 | 91视频第一页 | 91在线视频国产 | 亚洲免费一区 | 性欢交69精品久久久 | 国产资源网|