2009-06-24 18 views

Répondre

7

Object.wait()Object.notify()/Object.notifyAll().

ou Condition.await() et Condition.signal()/Condition.signalAll() pour Java 5+.

Edit: La spécification python est similaire la façon dont nous attendons généralement une implémentation Java ressemblerait à ceci:

class Event { 
    Lock lock = new ReentrantLock(); 
    Condition cond = lock.newCondition(); 
    boolean flag; 
    public void doWait() throws InterruptedException { 
     lock.lock(); 
     try { 
      while (!flag) { 
       cond.await(); 
      } 
     } finally { 
      lock.unlock(); 
     } 
    } 
    public void doWait(float seconds) throws InterruptedException { 
     lock.lock(); 
     try { 
      while (!flag) { 
       cond.await((int)(seconds * 1000), TimeUnit.MILLISECONDS); 
      } 
     } finally { 
      lock.unlock(); 
     } 
    } 
    public boolean isSet() { 
     lock.lock(); 
     try { 
      return flag; 
     } finally { 
      lock.unlock(); 
     } 
    } 
    public void set() { 
     lock.lock(); 
     try { 
      flag = true; 
      cond.signalAll(); 
     } finally { 
      lock.unlock(); 
     } 
    } 
    public void clear() { 
     lock.lock(); 
     try { 
      flag = false; 
      cond.signalAll(); 
     } finally { 
      lock.unlock(); 
     } 
    } 
} 
+8

S'il vous plaît ne pas suggérer wait() et notifier(). Quelqu'un pourrait les utiliser. –

+1

Merci, je vais aller avec java.util.concurrent.Condition – shikhar

+0

Juste vu votre montage avec l'exemple de la mise en œuvre de l'événement, merveilleux! Merci beaucoup. – shikhar

0

A related thread. Il y a un commentaire sur la réponse acceptée qui suggère un Semaphore ou un Latch. Pas la même sémantique que l'implémentation ci-dessus, mais pratique.

+1

Notez que le comportement opérationnel du sémaphore diffère de l'objet Event que vous avez demandé. – akarnokd

+0

oui, juste noté que :-) – shikhar