如何在Java中中断具有无限循环和休眠的线程
我已经为此奋斗了几个小时了。代码如下:如何在Java中中断具有无限循环和休眠的线程,java,multithreading,thread-safety,interrupt,Java,Multithreading,Thread Safety,Interrupt,我已经为此奋斗了几个小时了。代码如下: @Override public void run() { try { wscript.setBid(0.30); wscript.setServiceMode(WebScript.ServiceMode.ON); for(;!Thread.currentThread().isInterrupted();) { Posi
@Override
public void run()
{
try
{
wscript.setBid(0.30);
wscript.setServiceMode(WebScript.ServiceMode.ON);
for(;!Thread.currentThread().isInterrupted();)
{
Positioning(demandedPosition, maximumBid);
if(Thread.currentThread().isInterrupted())
break;
Thread.sleep(10000);
}
wscript.setServiceMode(ServiceMode.OFF);
Log("Algorithm has been canceled!");
}
catch (InterruptedException e)
{
wscript.setServiceMode(ServiceMode.OFF);
Log("Algorithm has been canceled!");
return;
}
问题是,我想用以下代码以合法的方式打断它:
private void StopService()
{
service.interrupt();
}
当我在Thread.sleep()运行时调用这个方法时,它会得到InterruptedException,一切正常。然而,正如我所说的,当定位算法运行时,什么都没有发生,线程的行为就像从未得到中断状态一样。
当做
双核
编辑:对我来说,调用日志(“算法已被取消!”)是至关重要的;将在中断后执行
已解决:我已覆盖Thread.interrupt()
以编辑类局部变量,该变量已检查线程是否准备结束:
service = new Thread(mechanism)
{
@Override
public void interrupt()
{
super.interrupt();
mechanism.ReadyToReturn = true;
}
};
下面是更新的线程主算法:
@Override
public void run()
{
try
{
wscript.setBid(0.30);
wscript.setServiceMode(WebScript.ServiceMode.ON);
for(;!ReadyToReturn || !Thread.currentThread().isInterrupted();)
{
Positioning(demandedPosition, maximumBid);
if(ReadyToReturn || Thread.currentThread().isInterrupted())
break;
Thread.sleep(10000);
}
wscript.setServiceMode(ServiceMode.OFF);
Log("Algorithm has been canceled!");
}
catch (InterruptedException e)
{
wscript.setServiceMode(ServiceMode.OFF);
Log("Algorithm has been canceled!");
return;
}
}
可能发生这种情况的原因是定位清除了
isInterrupted
标志(请参阅)和/或捕获了某个中断异常
(或异常
/可丢弃
)
一种可能是使用另一个标志(例如使用
volatile
variable/AtomicBoolean
/ThreadLocal
)来指示是否应中断线程 您的意思是,当您调用service.interrupt时,Positioning()不会立即退出吗?或者如果调用service.interrupt和Positioning()返回,则条件if(Thread.currentThread().isInterrupted())不为真?当我调用此函数时,Positioning()不会立即退出,并且Positioning()返回后条件也不为真。Positioning()正常< /代码>方法不会立即退出,如果它在某些工作的中间。但您至少可以设置interrupted
标志。您能告诉我们Positioning()
方法的内容吗?否则,JiriS的答案听起来是正确的。它有三个层次。我是说一个在另一个里面。检查太多了。我想我会尝试使用ThreadLocal变量(奇怪的是,我做不到)。第一段很好,但你的第二段没有意义。如果您可以在定位代码中添加检查标志,那么修复中断标志清除行为也同样容易。他使用的不是interrupted()
,而是isInterrupted()
,它不会清除标志。在任何情况下,他都应该使用自定义标志。即使是一个简单的易失性布尔值也可以做到这一点。不过,我会避免使用ThreadLocal
,在这里使用它没有任何意义。至于@NathanHughes,使用显式标志更有意义,因为线程可以被作者旁边的其他代码打断。@Kayaman:如果您有“因为线程可以被作者旁边的其他代码打断”的参考,我想读一下。@Kayaman:我知道他没有使用interrupted()
,但很明显,要么是Positioning()
,要么是其他代码在调用它。@NathanHughes我错了,我想的是虚假的唤醒。然而,使用一个单独的标志来清楚地表明意图,而不是使用“中断”作为一般退出标志,这并不是一个坏主意。