ExecutorService除了可以对线程池进行管理外,优势在于它可以进行关闭。不过要借用其中的一些关闭方法:shutdown()和shutdownNow(),和ExecutorService结合一起作用于线程池。下面就关闭线程池的方法进行分析,然后展示关闭方法的使用,最后结合ExecutorService关闭实例分享给大家。
1.关闭线程池
可以调用shutdown()或shutdownNow()来关闭线程池,其中原理是遍历所有工作线程,然后逐个调用线程的interrupt()来进行中断。但是它们存在一定的区别,shutdownNow首先将线程池的状态设置成STOP,然后尝试停止所有的正在执行或暂停任务的线程,并返回等待执行任务的列表,而shutdown只是将线程池的状态设置成SHUTDOWN状态,然后中断所有没有正在执行任务的线程。
2.关闭方法
shutdown(): Executor创建时处于运行状态。当调用ExecutorService.shutdown()后,线程池就会关闭,拒绝新提交的任务, 终止前允许执行以前提交的任务,包括队列中的任务。
shutdownNow():会将线程池关闭,拒绝新提交的任务,对于正在运行的线程进行打断,阻塞的队列中任务也会打断。这里会返回所有没有开始的任务。
isShutdown():是否关闭
isTerminated():是否所有的任务已经完成,如果完成则返回true
3.实例
如果程序通过 main() 方法启动,并且主线程退出了你的程序,如果还有活动的 ExecutorService 存在于程序中,存在于 ExecutorService 中的活动线程会阻止Java虚拟机关闭。
ExecutorServiceexecutorService=Executors.newCachedThreadPool(); //开启异步线程 executorService.execute(newSendRestult(processService,jsonString,approvalFlag,lesseeId)); publicfinalclassSendRestultimplementsRunnable{ privateIProcessServiceprocessService; privateStringparams; privateIntegerapprovalFlag; privateStringlesseeId; publicSendRestult(IProcessServiceprocessService,StringjsonData,IntegerapprovalFlag,StringlesseeId){ this.processService=processService; this.params=jsonData; this.approvalFlag=approvalFlag; this.lesseeId=lesseeId; } @Override publicvoidrun(){ try{ //调用第三方接口 processService.invokeSendStatusData(params,approvalFlag,lesseeId); }catch(Exceptione){ logger.error("异步推送出现了问题:",e); } } }
原文来自:https://www.py.cn
暂无评论内容