4 回答
TA贡献1836条经验 获得超5个赞
如果你暴露线程执行程序让你运行,那么你可以打断它。对我来说,这只打印1
4次表明中断成功。
请记住,这依赖于一个事实,即Thread.sleep
和System.out.println
是中断的。如果你没有检查Thread.isInterrupted
(就像他们两个那样),你仍然可能无法中断线程。
ExecutorService executor = Executors.newSingleThreadExecutor();private void test() throws InterruptedException { AtomicReference<Thread> thread = new AtomicReference<>(); Future<Object> task = executor.submit(() -> { // Keep track of the thread. thread.set(Thread.currentThread()); try { while (true) { Thread.sleep(1000); System.out.println("1"); } } finally { System.out.println("Interrupted: " + Thread.currentThread().isInterrupted()); } }); Thread.sleep(5000); // Interrupt the thread. thread.get().interrupt(); Thread.sleep(5000); System.out.println("Press <Enter> to shutdown"); new Scanner(System.in).nextLine(); executor.shutdown(); System.out.println("Press <Enter> to shutdown NOW"); new Scanner(System.in).nextLine(); executor.shutdownNow();}
TA贡献1876条经验 获得超7个赞
Threre在某些方面
为循环条件添加附加条件,
boolean shouldContinue
因此将此设置为false将在某个时刻退出循环如果您可以编写自己的功能(您拥有应用程序),您可以编写代码来列出所有线程并强制给定线程停止使用
Thread#stop
(不安全)或Thread#interrupt
(更安全)。如果您不拥有该应用程序 - 就像您正在运行一些应用程序 - 您可以使用自定义运行它,
javaagent
这将允许您执行与第2点相同的操作。
2和3,与prober集成,例如套接字,可以允许您在已经运行的进程中从外部执行此操作,例如。来自CLI
TA贡献1824条经验 获得超8个赞
请阅读shutdownNow()方法的javadoc 。它非常清楚地说:
除尽力尝试停止处理主动执行任务之外,没有任何保证。例如,典型的实现将通过Thread.interrupt()取消,因此任何未能响应中断的任务都可能永远不会终止。
因此,您需要做的是在代码中更改提交的任务以响应Thread.interrupt()
方法。即你需要更改你的行while (true)
以while (true && !Thread.currentTrhead().isInterrupted())
获取更多细节,在特定方法中读取线程类的 javadoc interrupt()
,interrupted()
以及isInterrupted()
添加回答
举报