如何优雅的关闭线程池?

线程池是系统资源,这篇文章主要介绍如何优雅关闭线程池

相关API:

Runtime.addShutdownHook解释

如果你想在jvm关闭的时候进行内存清理、对象销毁等操作,或者仅仅想起个线程然后这个线程不会退出,你可以使用Runtime.addShutdownHook。

这个方法的作用就是在JVM中增加一个关闭的钩子。当程序正常退出、系统调用 System.exit方法或者虚拟机被关闭时才会执行系统中已经设置的所有钩子,当系统执行完这些钩子后,JVM才会关闭。所谓钩子,就是一个已初始化但并不启动的线程。JVM退出通常通过两种事件。

程序正常退出,例如最后一个非守护进程退出、使用System.exit()退出等

程序异常退出,例如使用Ctrl+C触发的中断、用户退出或系统关闭等系统事件等 , 详情见官方文档:https://docs.oracle.com/javase/8/docs/api/index.html

Guava解释

google退出的open sdk,提供多类并发api。

上两篇文章讲了@Configuration @Bean @Import注入线程池Bean,还有ApplicationRunner 和 CommandLineRunner接口去实现容器启动完成事件驱动,所以结合起来举个例子,在项目中如何注入、优雅关闭线程池。

如上图。

1.通过@Configuration @Bean注解去注入一个线程池<componentThreadPool>。

2.将线程池注册到注册中心<ThreadPoolRegistrationCenter>

3.在Spring容器启动完成观察者模式中,利用ApplicationRunner接口提供的run方法,添加jvm hook钩子,以做到jvm退出时能够优雅关闭线程池。

其中用到了guava的<MoreExecutors.shutdownAndAwaitTermination>,jdk<Runtime.getRuntime().addShutdownHook>等API

  • 濡備綍浼橀泤鐨勫叧闂嚎绋嬫睜?
    绛旓細1.閫氳繃@Configuration @Bean娉ㄨВ鍘绘敞鍏ヤ竴涓嚎绋嬫睜<componentThreadPool>銆2.灏嗙嚎绋嬫睜娉ㄥ唽鍒版敞鍐屼腑蹇<ThreadPoolRegistrationCenter> 3.鍦⊿pring瀹瑰櫒鍚姩瀹屾垚瑙傚療鑰呮ā寮忎腑锛屽埄鐢ˋpplicationRunner鎺ュ彛鎻愪緵鐨剅un鏂规硶锛屾坊鍔爅vm hook閽╁瓙锛屼互鍋氬埌jvm閫鍑烘椂鑳藉浼橀泤鍏抽棴绾跨▼姹犮傚叾涓敤鍒颁簡guava鐨<MoreExecutors.shu...
  • 12鍒嗛挓浠嶦xecutor鑷《鍚戜笅褰诲簳鎼炴噦绾跨▼姹
    绛旓細浣跨敤绾跨▼姹犳椂锛屽埆蹇樹簡閲嶅啓afterExecute鏂规硶鏉ュ鐞咶uture.get鍙兘寮曞彂鐨勫紓甯革紝闃叉"娑堝け"銆傚悓鏃讹紝鑷畾涔夌嚎绋嬪伐鍘傝缃畊ncaughtException锛岃褰曟湭鎹曡幏鐨勫紓甯搞鍏抽棴绾跨▼姹鏃讹紝鍙互閫夋嫨浣跨敤shutdown()鎴杝hutdownNow()锛屽墠鑰浼橀泤鍦板仠姝换鍔★紝鍚庤呭己鍒跺仠姝紝浣嗗彲鑳芥棤娉曠珛鍗崇粓姝换鍔°傚浜庡畾鏃朵换鍔★紝ScheduledThreadPoolExecu...
  • 7000瀛+24寮犲浘甯︿綘褰诲簳寮勬噦绾跨▼姹
    绛旓細绾跨▼姹犵殑鐘舵佸彉鍖栦赴瀵屽鏍凤紝浠嶳UNNING鍒癟ERMINATED锛屾瘡涓樁娈甸兘鏈夊叾鐙壒鐨勬剰涔夈鍏抽棴绾跨▼姹鐨勬柟寮忔湁澶氱锛宻hutdown鏆傚仠鎺ユ敹鏂颁换鍔★紝鑰宻hutdownNow鍒欎細绔嬪嵆涓柇鎵鏈変换鍔★紝涓嶈繃瀹冧笉浼氬鐞嗛槦鍒椾腑鐨勯仐鐣欎换鍔°傜洃鎺х嚎绋嬫睜鐨勫仴搴风姸鎬佹槸鑷冲叧閲嶈鐨勶紝getCompletedTaskCount銆乬etLargestPoolSize銆乬etActiveCount鍜実etPoolSiz...
  • JAVA绾跨▼姹shutdown鍜宻hutdownNow鐨勫尯鍒
    绛旓細濡傚浘锛孉PI 涓湁瑙i噴锛宻hutdown 鍏佽涔嬪墠宸茬粡鎻愪氦浣嗘湭鎵ц鎴栨湭瀹屾垚鐨勪换鍔$户缁畬鎴愬畠锛岃 shutdownNow 闃绘宸茬粡鎻愪氦(浣嗗皻鏈繍琛岀殑)鐨勪换鍔¤繍琛屽苟涓斿皾璇曞仠姝㈡鍦ㄨ繍琛岀殑浠诲姟銆備竴鍙ヨ瘽锛宻hutdown 浼橀泤鑰屼笉绌舵棦寰锛岃宻hutdownNow 灏卞儚鍋滅數涓鑸秷鐏墍鏈夋棦鎴愪簨瀹炪
  • ios澶氱嚎绋嬩腑gcd鐨勪紭鍔垮強鍘熺悊,绾跨▼姹鏁堢巼闂,浣曟椂闇瑕佸彇娑堢嚎绋嬩换鍔
    绛旓細1.鏄撶敤:GCD姣斾箣thread鏇寸畝鍗曟槗鐢ㄣ傚熀浜巄lock鐨勭壒鎬у鑷村畠鑳芥瀬涓虹畝鍗曞緱鍦ㄤ笉鍚屼唬 鐮佷綔鐢ㄥ煙涔嬮棿浼犻掍笂涓嬫枃 2.鏁堢巼:GCD瀹炵幇鍔熻兘 杞婚噺銆浼橀泤,浣垮緱瀹冨湪寰堝鍦版柟姣斾箣涓撻棬鍒涘缓娑堣楄祫婧鐨勭嚎绋鏇 瀹炵敤涓斿揩閫 3.鎬ц兘:GCD鑷姩鏍规嵁绯荤粺璐熻浇鏉ュ鍑忕嚎绋嬫暟閲,杩欏氨鍑忓皯浜嗕笂涓嬫枃鍒囨崲浠ュ強澧炲姞浜嗚 绠楁晥鐜 4.瀹夊叏:鏃犻渶鍔...
  • tcp閫氶亾鍏抽棴鏃,鍙戠敓浜嗕粈涔? time_wait close_wait
    绛旓細鎵浠ュ畠涓鐩村浜嶤LOSE_WAIT涓傜粓浜庯紝鏌愪竴涓椂鍒伙紝鏈変竴涓鎴风鍏抽棴浜嗚繛鎺ワ紝鎴戜滑鏈変簡绌洪棽绾跨▼锛屽畠鍘绘煡鐪嬫殏瀛樺垪琛ㄣ傚彂鐜版湁涓涓猻ocket fd锛屽皾璇曞幓鎺ョ瀹冿紝瀵硅繖涓猣d鎵цread()锛岀劧鍚庡緱鍒颁竴涓狢onnection Reset error锛岀粓浜庯紝鎴戜滑鍙互浼橀泤鐨勫叧闂瀹冧簡锛圕LOSE_WAIT缁撴潫锛夈備互涓婂氨鏄叏閮ㄧ殑鏁呬簨銆
  • 绾跨▼姹涔婽hreadPoolExecutor浣跨敤
    绛旓細绾跨▼涓柇鏈哄埗 澶氱嚎绋嬪疄鐜版柟寮 FutureTask瀹炵幇鍘熺悊 绾跨▼姹涔婽hreadPoolExecutor姒傝堪 绾跨▼姹犱箣ThreadPoolExecutor浣跨敤 绾跨▼姹犱箣ThreadPoolExecutor鐘舵佹帶鍒 绾跨▼姹犱箣ThreadPoolExecutor鎵ц鍘熺悊 绾跨▼姹犱箣ScheduledThreadPoolExecutor姒傝堪 绾跨▼姹犵殑浼橀泤鍏抽棴瀹炶返 ...
  • 鍐欑粰澶у繖浜虹湅鐨濡備綍浼橀泤璁剧疆绾跨▼姹鐨勫ぇ灏
    绛旓細绾跨▼姹闇瑕佽缃悎閫傜殑澶у皬锛屽亣濡傝缃殑澶ぇ锛岀嚎绋嬩笂绾挎枃鍒囨崲杩囦簬棰戠箒锛岄犳垚澶ч噺璧勬簮寮閿锛屽弽鑰屼細浣挎ц兘闄嶄綆銆傚亣濡傝缃殑澶皬锛屽瓨鍦ㄥ緢澶氬彲鐢ㄧ殑澶勭悊鍣ㄨ祫婧愬嵈鏈湪宸ヤ綔锛屼細閫犳垚璧勬簮鐨勬氮璐瑰拰瀵瑰悶鍚愰噺閫犳垚鎹熷け銆備负浜嗗厖鍒嗗埄鐢ㄥ鐞嗗櫒璧勬簮锛屽垱寤虹殑绾跨▼鏁拌嚦灏戣绛変簬澶勭悊鍣ㄦ牳蹇冩暟銆傚鏋滄墍鏈夌殑浠诲姟閮芥槸璁$畻瀵嗛泦鍨嬬殑锛岄偅涔...
  • netty鐨勫疄渚嬫槸浠涔?
    绛旓細// 绛夊緟鏈嶅姟绔洃鍚鍙鍏抽棴 f.channel().closeFuture().sync(); } finally { // 浼橀泤閫鍑,閲婃斁绾跨▼姹璧勬簮 bossGroup.shutdownGracefully(); workerGroup.shutdownGracefully(); } } private class ChildChannelHandler extends ChannelInitializer<SocketChannel> { @Override protected void initChannel(SocketChannel ar...
  • 绾跨▼姹linux绾跨▼姹爈inux
    绛旓細1锛氫娇鐢╣lib鐨勭嚎绋嬫睜锛実threadpool锛岃繖涓槸linuxC涓嬮潰鐨勪竴涓嚎绋嬫睜瀹炵幇锛屽彲浠ョ敤浜庣敓浜х幆澧冦2锛氳嚜宸辫璁$嚎绋嬫睜锛屼絾鏄璁′竴涓伐涓氬己搴鐨勭嚎绋嬫睜鏄竴浠堕潪甯稿鏉傜殑浜嬫儏锛屽挨鍏剁敤C鏉ュ疄鐜般備竴鑸濊矾灏辨槸寤虹珛涓涓嚎绋嬫睜绠$悊鍑芥暟锛屼竴涓嚎绋嬪嚱鏁板苟鍒涘缓涓缁勭嚎绋嬶紝涓涓叏灞鐨勭嚎绋嬬姸鎬佹暟缁勶紝绾跨▼绠$悊鍑芥暟閫氳繃鍏ㄥ眬绾跨▼...
  • 扩展阅读:线程池参数最佳设置 ... 线程池流程图 ... 为什么不建议用线程池 ... 如何创建一个线程池 ... 线程池队列满了怎么办 ... 如何关闭超线程 ... 为什么不建议用多线程 ... 笔记本怎么关闭超线程 ... 台式电脑怎么关闭超线程 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网