2016-08-05 2 views
0

Хотелось бы, чтобы мой основной поток уведомил другую тему о данном событии, но не остановился. Другой поток - это бесконечный цикл, и мне нужно, чтобы он ждал после каждой итерации, пока основной поток не просыпает его снова.Как уведомить ожидающий поток без приостановки основного?

Это, кажется, исключает шаблон wait/notify, поскольку он приостанавливает поток, который вызывает уведомления на общем мониторе. Я также подумал о CyclicBarrier, но я не хочу, чтобы основной поток вызывал Barrier.await, и ждать, пока другая нить не вызовет Barrier.await, потому что это может занять много времени ...

Любая идея? Благодаря !

+0

Как-то кричит [Семафор] (https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Semaphore.html) мне: Фон нить Декременты семафор, ждет, если ноль, основной поток увеличивает семафор. Никаких ожиданий в основной теме. Можете ли вы подробнее рассказать о проблеме? – dhke

+0

Возможный дубликат [Как временно приостановить Threads с помощью wait() и notify()] (http://stackoverflow.com/questions/26764650/how-do-i-pause-threads-properly-with-wait-and -поставить в известность) – sheepiiHD

ответ

0

сделать ожидающий поток, как это:

class MyThread extends Thread() { 
private volatile boolean go; 

public void wakeUpBuddy() { 
    go=true; 
    synchronized(this) { 
     notify(); 
    } 
} 

public void run() { 

    while(!interrupted()) { 
    // some work before wait 

    synchronized(this) { 
     while(!go) { 
     wait(); 
     } 
     go = false; 
    } 

    // some work after release 
    } 
} 


} 

Тогда из основного вызова резьбы на экземпляре MyThread.wakeUpBuddy(); и он пройдет один проход и ждет другого вызова.

0

Как насчет использования шаблона наблюдателя?

import java.util.Observable; 
import java.util.Observer; 
import java.util.concurrent.TimeUnit; 

public class Main extends Observable { 

    public static void main(String... args) { 

     final MyThread t = new MyThread(); 

     final Main m = new Main(); 
     m.addObserver(t); 

     // start the thread 
     t.start(); 

     for (int i = 0; i < 25; i++) { 
      if (i % 5 == 0) { // event received? 
       m.setChanged(); 
       m.notifyObservers(i); 
      } 

      try { 
       Thread.sleep(TimeUnit.SECONDS.toMillis(1)); 
      } catch (Exception ex) { 

      } 
     } 

    } 

} 

class MyThread extends Thread implements Observer { 

    private boolean wait = true; 

    @Override 
    public void run() { 

     while (true) { 

      while (wait) { 
       try { 
        Thread.sleep(TimeUnit.SECONDS.toMillis(1)); 
       } catch (InterruptedException ex) { 
        // interrupted 
       } 
      } 

      System.out.println("I am invoked .."); 
      wait = true; 
     } 

    } 

    @Override 
    public void update(Observable o, Object arg) { 
     System.out.println("Update received .. " + arg); 
     wait = false; 
    } 

} 
Смежные вопросы