4 回答
TA贡献1836条经验 获得超5个赞
如果你暴露线程执行程序让你运行,那么你可以打断它。对我来说,这只打印14次表明中断成功。
请记住,这依赖于一个事实,即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()
添加回答
举报
