2015-09-23 5 views
3
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) 
+0

Возможно, вы должны использовать CountDownLatch вместо Thread.sleep() и прерывания ... Или некоторые другие средства из параллельного пространства имен. – Fildor

+0

То, что вы хотите достичь точно – virendrao

ответ

1

Сохраните ссылку на тему при ее запуске и позвоните по номеру Thread#interrupt. Если поток спящий, прерывание вызовет метод сна, который сократит свой сон и выбросит InterruptedException; если поток не спит, тогда будет установлен прерванный флаг.

У меня есть пример прерывания потока в this answer.

Использование ожидания вместо сна означает, что вам нужно ввести общую блокировку и переменную условия. Ожидающий поток должен будет получить эту блокировку, а затем ждать в цикле, проверяя переменную условия.

условия переменного и петли необходимы по нескольким причинам:

1) Поток может вернуться от ожидания, не получив уведомления (далее «паразитное пробуждение»), и

2) уведомление когда нить не имеет блокировки, и нет информации о том, будет ли состояние по-прежнему быть таким же, как состояние, вызвавшее уведомление, когда поток успевает повторно закрепить замок.

В этом случае это кажется как намного меньше проблем, чтобы использовать прерывание здесь.

0

Вы можете использовать ArrayBlockingQueue и использовать poll(long, java.util.concurrent.TimeUnit).

Все, что вам нужно, это просыпать протектор, отправить что-то в очередь.

Пожалуйста, не пытайтесь использовать wait/notify, так как существует множество краевых случаев, когда этот механизм выходит из строя. Например, если notify происходит сразу после того, как wait раз, будет ли следующий конец сразу же закончен? Использование BlockingQueue позволяет вам слить его в соответствующее время.