如何强制停止无限循环线程

以下是代码段

ExecutorService executor = Executors.newSingleThreadExecutor();executor.submit(() -> {
    while (true) System.out.println("1");});executor.shutdown();executor.shutdownNow();

有没有办法从外面关闭执行人?(建议不能改变任务本身) 就像linux中的kill -9一样


墨色风雨
浏览 1352回答 4
4回答

一只甜甜圈

如果你暴露线程执行程序让你运行,那么你可以打断它。对我来说,这只打印14次表明中断成功。请记住,这依赖于一个事实,即Thread.sleep和System.out.println是中断的。如果你没有检查Thread.isInterrupted(就像他们两个那样),你仍然可能无法中断线程。ExecutorService&nbsp;executor&nbsp;=&nbsp;Executors.newSingleThreadExecutor();private&nbsp;void&nbsp;test()&nbsp;throws&nbsp;InterruptedException&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;AtomicReference<Thread>&nbsp;thread&nbsp;=&nbsp;new&nbsp;AtomicReference<>(); &nbsp;&nbsp;&nbsp;&nbsp;Future<Object>&nbsp;task&nbsp;=&nbsp;executor.submit(()&nbsp;->&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Keep&nbsp;track&nbsp;of&nbsp;the&nbsp;thread. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;thread.set(Thread.currentThread()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(true)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(1000); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("1"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;finally&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Interrupted:&nbsp;"&nbsp;+&nbsp;Thread.currentThread().isInterrupted()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}); &nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(5000); &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Interrupt&nbsp;the&nbsp;thread. &nbsp;&nbsp;&nbsp;&nbsp;thread.get().interrupt(); &nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(5000); &nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Press&nbsp;<Enter>&nbsp;to&nbsp;shutdown"); &nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;Scanner(System.in).nextLine(); &nbsp;&nbsp;&nbsp;&nbsp;executor.shutdown(); &nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Press&nbsp;<Enter>&nbsp;to&nbsp;shutdown&nbsp;NOW"); &nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;Scanner(System.in).nextLine(); &nbsp;&nbsp;&nbsp;&nbsp;executor.shutdownNow();}

幕布斯6054654

Threre在某些方面为循环条件添加附加条件,boolean shouldContinue因此将此设置为false将在某个时刻退出循环如果您可以编写自己的功能(您拥有应用程序),您可以编写代码来列出所有线程并强制给定线程停止使用Thread#stop(不安全)或Thread#interrupt(更安全)。如果您不拥有该应用程序 - 就像您正在运行一些应用程序 - 您可以使用自定义运行它,javaagent这将允许您执行与第2点相同的操作。2和3,与prober集成,例如套接字,可以允许您在已经运行的进程中从外部执行此操作,例如。来自CLI

有只小跳蛙

请阅读shutdownNow()方法的javadoc 。它非常清楚地说:除尽力尝试停止处理主动执行任务之外,没有任何保证。例如,典型的实现将通过Thread.interrupt()取消,因此任何未能响应中断的任务都可能永远不会终止。因此,您需要做的是在代码中更改提交的任务以响应Thread.interrupt()方法。即你需要更改你的行while (true)以while (true && !Thread.currentTrhead().isInterrupted())获取更多细节,在特定方法中读取线程类的 javadoc interrupt(),interrupted()以及isInterrupted()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java