[英]How to synchronize Thread.sleep and Thread.interrupt in Java?
[英]How to interrupt a thread with infinite loop and sleep in Java
我已经为此战斗了几个小时。 这是代码:
@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并且一切正常。 但是,正如我所说的,当PositioningAlgorithm运行时,什么也没有发生,线程的行为就像它从未处于中断状态一样。 问候,双核
编辑:对我来说,至关重要的是调用Log(“ Algorithm has been cancelled!”); 将在中断后执行。
已解决:我已经覆盖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
标志(请参阅https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#interrupted%28%29 )和/或在某个地方捕获InterruptedException
(或Exception
/ Throwable
)。
一种可能性是使用另一个标志(例如,使用volatile
变量/ AtomicBoolean
/ ThreadLocal
)来指示是否应中断线程。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.