【问题标题】:Interrupt the thread中断线程
【发布时间】:2015-09-23 12:15:01
【问题描述】:
 protected void waitAndSweep(String symbol) {
    try { 
      long sweepTime = symbolInfo.getSweepTime(symbol);
      long timeSinceLastSweep = System.currentTimeMillis() - sweepTime;
      long waitTime = timeSinceLastSweep >= getInterval() ? 0 : getInterval() - timeSinceLastSweep;
      logTradeEvent("waitAndSweep", symbol, "waittime: " + waitTime);
      if (waitTime > 0){
          Thread.sleep(waitTime);  
      }
      callSweep(symbol);
    }catch (InterruptedException e) {
      Thread.currentThread().interrupt();
    }catch (Exception e) {
      logEvent(StrategyEntry.ERROR, "waitAndSweep", symbol,
          "Exception caught...", e);
    }
  }

当它处于休眠状态时(Thread.sleep),如何中断这个线程,使其退出waitandSweep方法?

private void replace(){
// interrupt the thread;
// call waitandsweep again here;
waitandsweep(symbol)

【问题讨论】:

  • 也许您应该使用 CountDownLatch 而不是 Thread.sleep() 并中断......或来自并发命名空间的其他方式。
  • 你想要达到的目标

标签: java multithreading interruption


【解决方案1】:

使用wait() 而不是sleep() 允许您通过notify() 唤醒线程,参见例如Difference between wait() and sleep()

【讨论】:

    【解决方案2】:

    在启动线程时保留对线程的引用,并在该引用上调用Thread#interrupt。如果线程正在休眠,则中断将导致 sleep 方法缩短其休眠并抛出 InterruptedException;如果线程没有休眠,则设置中断标志。

    我有一个中断this answer中的线程的例子。

    使用等待而不是睡眠意味着您必须引入共享锁和条件变量。等待线程必须获得该锁,然后在循环中等待,检查条件变量。

    需要条件变量和循环有几个原因:

    1) 线程可以在没有收到通知的情况下从等待中返回(“虚假唤醒”),并且

    2) 通知是在线程没有锁的时候发出的,一旦线程设法重新获得锁,状态是否仍会与导致通知的状态相同

    在这种情况下,在这里使用中断似乎会少很多麻烦。

    【讨论】:

      【解决方案3】:

      您可以使用ArrayBlockingQueuepoll(long, java.util.concurrent.TimeUnit)

      然后你需要做的就是唤醒胎面,在队列中发布一些东西。

      请不要尝试使用wait/notify,因为在许多边缘情况下该机制会失败。例如,如果notify 发生在wait 超时之后,下一个等待会立即结束吗?使用BlockingQueue 可以让您在适当的时候将其排空。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-16
        • 1970-01-01
        • 2012-03-31
        • 2014-08-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多