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
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...
Erraten nur Object.wait(), Object.notify() und Object.notifyAll() würde ausreichen.
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
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
Sie können java.util.concurrent Paket
http://rajendersaini.wordpress.com/2012/05/10/waitformultipleobject-in-java/
- 1. WaitForMultipleObjects Alternative mit Std :: Thread?
- 2. Java-Streams in Java 7
- 3. Messzeit in Java JNI (nativer Aufruf Java)
- 4. Java: Methoden wie ord PHP in Java
- 5. Java-Funktionen in Java serialisieren 8
- 6. Convert Java Servlet in Standalone-Java-Anwendung
- 7. Java instanziiert Short-Objekt in Java
- 8. Worin liegt die Diskrepanz in Java-Versionen: Java 6 (in Terminal, Eclipse) und Java 7 (in Java Control Panel)?
- 9. Assign Operator in Java
- 10. Generisches Vererbung in Java
- 11. Übergeordnete Standardcodierung in Java
- 12. MSXML-Parser in Java
- 13. Rasterung in Java
- 14. diff Implementierung in Java
- 15. Benutzerdefinierte Konvertierungsspezifikatoren in Java
- 16. blenden (kryptologie) in java
- 17. Bouncing Ball in Java
- 18. Erzeuger Verbraucher in Java
- 19. Dateierstellungsdatum ermittelt in Java
- 20. Standard-Initialisierung in Java
- 21. Objektbaum-Navigationssprache in Java
- 22. Mehrere Müllsammler in Java
- 23. Decorator in Java
- 24. Prime Factorization in Java
- 25. Float-Nummern in Java
- 26. Monitor-Klasse in Java
- 27. Whitespaces in Java
- 28. letztes Objekt in Java
- 29. 'Reentrancy' in Java
- 30. Escaping Komma in Java
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
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. –