我上了一门课叫 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()
在另一条线上运行,但我不知道。
2条答案
按热度按时间ghhkc1vu1#
尝试以下操作:
一个完整的例子可以在这里找到:
如何杀死java线程
3vpjnl9f2#
没有一个好的方法从外部阻止runnable(作为最后的手段,有stop,但这不是一个好方法)。runnable需要是一个好公民,并使用thread.currentthread().isinterrupted()检查中断本身。如果runnable捕捉到interruptedexception,中断标志将被清除;runnable需要通过调用当前线程上的中断来恢复中断标志。
在发布的代码中,发生的情况是runnable在工作线程上执行,工作线程在runnable完成之前没有机会检查中断标志。假设runnable是
然后,当worker被中断时,睡眠将被缩短,但是中断标志将被清除,这样runnable将在循环的下一次迭代中再次执行。