Java ExcutorService优雅关闭方式解析

网友投稿 305 2022-12-05


Java ExcutorService优雅关闭方式解析

关闭时可使用如下代码

public static void waitUntilTerminate(final ExecutorService executorService, final int timeout) {

try {

executorService.shutdown();

if (!executorService.awaitTermination(timeout, TimeUnit.SECONDS)) { //超时后直接关闭

executorService.shutdownNow();

}

} catch (InterruptedException e) { //awaitTermination 出现中断异常也将触发关闭

executorService.shutdownNow();

}

}

但是实际使用中,可能会出现即使使用了shutdownNow方法,还是无法终止线程的问题,那是因为你的线程无法被中断

shutdownNow方法简单理解就是给在运行的线程发一个中断信号,如果你的线程忽略这个信号,那就无法停下来http://

举个例子来说明这个问题

public class ShutDownUtilsTest {

private ExecutorService executorService;

@Before

public void init() {

executorService = Executors.newFixedThreadPool(1);

}

@Test

public void shutDownOKTest() {

ShutDownUtils.waitUntilTerminate(executorService, 1);

CommonUtils.sleep(1); //等待线程处理中断

Assert.assertTrue(executorService.isTerminfMDaWLnated());

}

@Test

public void shutDownNowFailTest() {

executorService.execute(this::canNotStopThread);

ShutDownUtils.waitUntilTerminate(executorService, 0);

CommonUtils.sleep(1); //等待线程处理中断

Assert.assertFalse(executorService.isTerminated());

}

@Test

public void shutDownNowOKTest() {

executorService.execute(this::stopThread);

ShutDownUtils.waitUntilTerminate(executorService, 0);

CommonUtils.sleep(1); //等待线程处理中断

Assert.assertTrue(executorService.isTerminated());

}

private void canNotStopThread() {

for (long i = 0; i < Long.MAX_VALUE; i++) {

}

}

private void stopThread() {

for (long i = 0; i &ltfMDaWLn; Long.MAX_VALUE && !Thread.currentThread().isInterrupted(); i++) {

}

}

}

从上面的测试用例可以看到canNotStopThread无法被shutDownNow终止

然而stopThread可以被正常终止,因为通过Thread.currentThread().isInterrupted()在判断线程是否收到了中断信号


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java接口幂等性设计原理解析
下一篇:Matlab及Java实现小时钟效果
相关文章

 发表评论

暂时没有评论,来抢沙发吧~