2009-04-25 2 views
3

Was wäre die eleganteste Art, ein Win32-Äquivalent von WaitForMultipleObjects in Java (v6) zu implementieren. Ein Thread schläft, bis eines von mehreren Ereignissen eintritt. Wenn das passiert, möchte ich es verarbeiten und wieder schlafen gehen. Es sind keine Daten erforderlich, nur ein Ereignis.WaitForMultipleObjects in Java

Antwort

5

Es hängt wirklich davon ab, was Sie damit machen wollen, aber Sie könnten etwas so einfaches tun wie die wait/notify-Methoden oder Sie könnten die Strukturen im Paket java.util.concurrency verwenden. Letzteres wäre persönlich meine Wahl. Sie können problemlos eine BlockingQueue einrichten, in die Produzenten Ereignisobjekte einfügen und Benutzer beim Entfernen der Ereignisse blockieren können.

// somewhere out there 
public enum Events { 
    TERMINATE, DO_SOMETHING, BAKE_SOMETHING 
} 

// inside consumer 
Events e; 
while((e = queue.take()) != TERMINATE) { 
    switch(e) { 
    case DO_SOMETHING: 
     // blah blah 
    } 
} 

// somewhere else in another thread 
Events e = BAKE_SOMETHING; 
if(queue.offer(e)) 
    // the queue gladly accepted our BAKE_SOMETHING event! 
else 
    // oops! we could block with put() if we want... 
+0

Ich möchte eine einfache Konstruktion ohne zusätzliche Objekte haben. Hier ist der Pseudocode: int event; while ((event = waitOnSomething()) = Kündigung!) { Schalter (event) { Fall 0: // do Sachen Fall 1: // do Sachen } } – Dima

+0

Sie eine ENUM nutzen können als Ihr Ereignis (so können Sie sie und alles einschalten) und verwenden Sie in diesem Fall einfach eine grundlegende blockierende Warteschlange. Ihr Consumer-Thread wird auf queue.take() blockiert - das wird blockiert, bis jemand etwas mit queue.offer() oder etwas ähnlichem in die Warteschlange wirft. –

-1

Erraten nur Object.wait(), Object.notify() und Object.notifyAll() würde ausreichen.

+3

Nein, Object.wait() nur wartet auf ein einzelnes Objekt CountDownLatch Objekt zur Verfügung gestellt verwenden. Wenn Sie WaitForMultipleObjects() in Win32 verwenden, warten Sie normalerweise, dass eines der verschiedenen Dinge passiert. Wenn die Wartezeit zurückkehrt, erhalten Sie den Index des Objekts, das die Freigabe ausgelöst hat. Sehr praktisch, wenn Sie einen einzelnen Thread haben, der auf mehrere Clients wartet. Ich habe hier keine gute Lösung, aber was ich ein paar Mal getan habe, um den Sammelpunkt auf Objekte in einer Warteschlange warten zu lassen und dann einen Thread pro Objekt warten zu lassen. Wenn die Einzelobjekt - Kellner benachrichtigt werden, legen sie etwas auf ein Warteschlange und wartet auf Anweisungen. – Fredrik

+0

Nachdem gesagt, es ist kein sehr gutes Muster, also würde ich es nicht kopieren :-). Es war eher als Beispiel gedacht, um das Feature für Antyom zu beschreiben. – Fredrik