我几个小时以来一直在为此而战。这是代码:
class Sercher:
def __init__(connection):
self.cursor = connection.cursor()
...
def search(self, node_id):
...
# access: self.cursor
...
#recursion
self.search(next_node_id)
问题是,我想用这段代码合法地打断它:
@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;
}
当我在Thread.sleep()运行时调用此方法时,它会收到InterruptedException,一切正常。但是,正如我在PositioningAlgorithm运行时所说的那样,没有任何事情发生,线程的行为就像它从未进入中断状态一样。 问候, 双核
编辑:调用Log(“算法已取消!”)对我来说至关重要;将在中断后执行。已解决:我已覆盖private void StopService()
{
service.interrupt();
}
来编辑类本地变量,检查该线程是否已准备好结束:
Thread.interrupt()
这里有更新的主线算法:
service = new Thread(mechanism)
{
@Override
public void interrupt()
{
super.interrupt();
mechanism.ReadyToReturn = true;
}
};
答案 0 :(得分:2)
可能发生这种情况的原因是,定位会清除isInterrupted
标记(请参阅https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#interrupted%28%29)和/或捕获某处InterruptedException
(或Exception
/ {{1} })。
一种可能性是使用另一个标志(例如,使用Throwable
变量/ volatile
/ AtomicBoolean
)来指示线程是否应该被中断。