gpt4 book ai didi

java - 如何杀死在线程中运行的 Runnable?

转载 作者:行者123 更新时间:2023-12-03 13:02:02 25 4
gpt4 key购买 nike

我创建了一个名为 AbortableThread 的类,它应该在我需要时启动和停止线程。该类相对较小,因为它只包含以下代码:

public class AbortableThread implements Runnable
{
private Thread worker;
private Runnable target;

public AbortableThread(Runnable target)
{
this.target = target;
}

public void start()
{
worker = new Thread(this);
worker.start();
}

public void stop()
{
worker.interrupt();
}

public void run()
{
while (!worker.isInterrupted())
target.run();
}
}

但是,调用 stop() 不会 停止线程。我认为那是因为 target.run() 在单独的线程上运行,但我不知道。

最佳答案

没有从外部停止 Runnable 的好方法(作为最后的手段,有停止,但这不是一个好方法)。Runnable 需要成为一个好公民,并使用 Thread.currentThread().isInterrupted() 检查自身是否中断。如果Runnable捕获到InterruptedException,中断标志将被清除; Runnable 需要通过调用当前线程的中断来恢复中断标志。

在发布的代码中,Runnable 在工作线程上执行,而工作线程在 Runnable 完成之前永远没有机会检查中断标志。假设 Runnable 类似于

() -> { try {
Thread.sleep(100000L):
} catch (InterruptedException e) {}}

然后当 worker 被中断时, sleep 将被缩短,但中断标志将被清除,因此 Runnable 将在循环的下一次迭代中再次执行。

关于java - 如何杀死在线程中运行的 Runnable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65169267/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com