Wie können zwei threads kommunizieren, während beide laufen?
Ich habe versucht, mir beibringen, Parallelität, und ich habe ein Problem. Ich verstehe, dass zwei Java-threads können miteinander kommunizieren über wait()
und notify()
. Dies erfordert jedoch, dass ein thread inaktiv sein und im wesentlichen "nur herumsitzen", bis der andere aufwacht es.
Ist es möglich, dass beide threads gleichzeitig ausgeführt und habe Sie immer noch hören, für Benachrichtigungen von anderen? Würde dies erreicht werden durch Parallelität Techniken oder stattdessen etwas wie ein ActionListener
?
Beispielsweise das Projekt, das ich bin, dieses zu testen, ist im Grunde ein Gitter, wo die verschiedenen Körperschaften schlendern durch verschiedene Zellen. Wenn zwei Personen zufällig Wandern in der gleichen Zelle, ich möchte eine Benachrichtigung des anderen und etwas anderes passieren wird auf dieser Basis (zum Beispiel eine Begrüßung: "Hallo du!"). Aber so wie es da steht, mit der wait/notify-Paradigma, einem der threads/Unternehmen hat, um einfach nur sitzen in einer Zelle zu warten, für andere zu Wandern; Sie können nicht beide bewegen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es ein paar Möglichkeiten, können Sie die Kommunikation zwischen den threads. Verwenden die gebräuchlichste Methode, die Sie verwenden können Instanz-Variablen, um Informationen zwischen den threads, aber man muss Sorge tragen, dass schreiben nur von einem thread oder synchronisieren von Aktualisierungen der gemeinsamen Variablen. Alternativ können Sie die Pipe-I/O-streams, die entworfen wurden für die inter-thread-Kommunikation, oder der übergabe der raw-Daten zwischen threads. Ein thread schreibt Infos zu dem stream, während der andere liest es.
Hier ist ein Beispiel für die Methode, die Lesen würden, die Ausgabe von einer langsamen Netzwerk-Verbindung und werfen Sie es auf "System".aus Verwendung von threads.
Aber es hört sich fast so an, Sie möchten einen Ereignis-callback-Mechanismus, wo ein thread (user interface thread) benachrichtigt, wenn der andere thread erkennt eine bestimmte Bedingung. Abhängig von Ihrer Plattform viel davon gebacken. Mit Android, zB., man kann einen thread, der bestimmt, dass eine raster-Einheit verschoben. Es würde senden Sie eine Aktualisierung auf die wichtigsten user-interface-thread repaint den Bildschirm. Ein solches update könnte folgendermaßen Aussehen:
In diesem Szenario haben Sie einen hintergrund-thread, dass Werke aus der position des auf dem Bildschirm angezeigten Elemente und informiert den Haupt-thread, wenn Elemente, die Positionen ändern. Es ist eine extrahierte Methode, die bestimmt, wenn 2 Punkte sind zufällig oder der gleichen.
Können Sie
Erlang
Sprache zu kommuniziert sicher unter dieProcesses
was läuft im eigenen Adressraum zusammen mitJava
als eine bessere und sichere alternative zu thread.Den "klassischen" Java-threading-tutorials lehren wait/notify früh auf. Zurück, um die Java-1.1 -, 1.2 Zeitrahmen, das ist alles es war.
Allerdings, wenn Sie können eine Kopie der ausgezeichneten "Java Concurrency in Practice" von Brian Goetz, wait/notify nicht behandelt werden, bis Sie in Kapitel 14, "erstellen von Benutzerdefinierten Synchronisierungen" in Abschnitt IV fortgeschrittene Themen. Ich bin schwer Umschreibung hier, aber der Eindruck, den ich bekam, war "OK, wenn Sie Sie haben Lesen Sie den vorherigen 300 Seiten und keiner der Bausteine, die bisher besprochen haben, Ihre Bedürfnisse zu erfüllen, dann können Sie versuchen, bauen Sie Ihre eigenen mit wait/notify".
Mein Punkt ist, dass wait/notify, obwohl sehr wichtig, vielleicht nicht der beste Ort, um zu lernen Parallelität. Einige der Antworten/Kommentare, die in dieser Frage (producer/consumer, ExecutorService) verweisen auf die höhere Ebene Parallelität Bausteine, die Hinzugefügt wurden, in Java 5. Obwohl dieses Zeug wurde später Hinzugefügt, es ist die Sachen, die Sie sollten lernen die ersten.
Zurück zu deiner Frage - hier sind ein paar Gedanken:
Wenn dies ist eine GUI-Anwendung, und Sie möchten, um einen hintergrund-thread, tun einige Arbeit, check-out SwingWorker. Ich habe Erfolg mit einem SwingWorker (Abschnitt 9.3.3), wo der hintergrund-thread liest Nachrichten aus einer Warteschlange blockiert werden (Abschnitt 5.3) hat einige Arbeit und benachrichtigt die GUI-thread durch aufrufen der höheren Stufe "publish" - Methode. Keine "wait/notify" - zumindest nicht in meinem code.
Wenn die Anwendung nicht im Swing-basiert und Sie möchten, um verschiedene threads Aufgaben parallel und gelegentlich gegenseitig Nachrichten senden, sollten ZeroMQ "Der socket-Bibliothek, die fungiert als ein concurrency-framework." Mit ZeroMQ, jeder thread ausgeführt wird, eine Ereignis-Schleife, die liest und verarbeitet Nachrichten. Ein thread kann die Arbeit geplant auf seinen eigenen thread durch senden sich selbst eine Nachricht. Sie können planen, arbeiten/unterrichten, in einem anderen thread, indem Sie eine Nachricht in diesen thread (Buchse).
Jedenfalls, viel Glück.
Versuchen Sie es mit
ThreadManager
Klasse, die hatList<Thread>
und ist wie eine Art von semaphor-Objekt. Deine threads sollten in der Lage sein zu finden, und Verweise auf andere threads von dort.Wann immer Sie warten nicht, Sie können etwas tun zur gleichen Zeit. Wenn Sie zu sein scheinen, die nur darauf warten, für jeden anderen ist es wahrscheinlich, Sie sind besser dran mit einem thread. (Die Verwendung von mehreren threads ist nicht immer besser)
Es ist eher ein design-Problem mit, wie Sie aufgeschlüsselt haben das problem. Threads funktionieren am besten, wenn es ein minimum an Interaktion zwischen Ihnen. Wenn Sie sind stark voneinander abhängig, Sie sollten weniger threads.
Ich sehe nicht ein, warum Sie müssen wait/notify zu sehen. Ich würde nur noch Sie bewegen und senden von Nachrichten an einander, wenn Sie in der gleichen Zelle.