如何使用无限循环中断线程并在Java中休眠

时间:2015-06-16 12:42:41

标签: java multithreading thread-safety interrupt

我几个小时以来一直在为此而战。这是代码:

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;
                }
            };

1 个答案:

答案 0 :(得分:2)

可能发生这种情况的原因是,定位会清除isInterrupted标记(请参阅https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#interrupted%28%29)和/或捕获某处InterruptedException(或Exception / {{1} })。

一种可能性是使用另一个标志(例如,使用Throwable变量/ volatile / AtomicBoolean)来指示线程是否应该被中断。