2017-12-15 17 views
2

Also in Ada Programmiersprache ist ein Rendezvous eine Methode der Interprozess-Synchronisation/Message-Passing. Wie implementiere ich diesen Mechanismus in Java (zusammen mit Task Suspending und Selective Wait)? Ich habe Java Remote-Methodenaufruf und Exchange-Klasse betrachtet, aber ich muss noch eine geeignete Lösung finden.Ada Rendezvous Gegenstück in Java

+1

Angesichts der Tatsache, dass Java-Nebenläufigkeitsfunktionen Low-Level (und fehleranfällig) sind, sollte es möglich sein, das Äquivalent der High-Level-Concurrency-Funktionen von Ada zu implementieren. Die Frage ist, wie viel Aufwand Ihr Projekt Ihnen ermöglichen wird. Wenn Sie wirklich eine Rendezvous-Semantik benötigen, sollten Sie vielleicht abschätzen, wie lange es dauern würde, um das gewünschte Verhalten in Ada und in Java zu implementieren und es denen zu präsentieren, die das Budget kontrollieren. –

Antwort

2

Nicht vertraut mit ada aber eine schnelle Google auf ada Rendezvous empfiehlt Ihnen, für eine der BlockingQueue Implementierungen suchen können, möglicherweise SynchronousQueue.

Vielleicht, wenn Sie beschreiben, was Sie passieren möchten, wenn eine Nachricht übergeben wird, könnten wir mehr helfen.

+0

Ich entschied mich, mit SynchronousQueue zu gehen und (sieht aus wie) es funktioniert. Grundsätzlich hatte ich den Auftrag, eine 8-förmige Spur zu schaffen, auf der man Autos ablegen und laufen lassen kann. Ich musste sicherstellen, dass sie nicht an der Kreuzung abstürzen. Car-Threads machen Aufrufe an den Track-Prozess, um zu fragen, ob sie sich vorwärts bewegen können, und wenn 2 Autos an der Kreuzung ankommen, darf ein zufälliger durchfahren werden, wenn die Kreuzung leer ist. – kbijoch

+0

@kbijoch - Gerne helfen, aber Ihre Beschreibung klingt eher so, als würden Sie mehr nach einem [Semaphore] suchen (https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Semaphore.html) oder ein [CountDownLatch] (https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.html), aber wenn die 'SynchronousQueue' für Sie funktioniert, dann gehen Sie dafür. – OldCurmudgeon

+0

Ja, ich weiß, aber mein Professor sagte uns ausdrücklich, Adas Rendezvous zu implementieren. Ich weiß nicht, Motivation, dies aber er sagte, meine Lösung ist in Ordnung so was auch immer. – kbijoch

4

Die schwierigsten Teile, die in Java implementiert werden, sind selektive Warte- und Eingabeschlangen. Eine blockierende Warteschlange ist eine ungefähre Simulation eines geschützten Eintrags in Ada ohne selektives Warten.

Ich glaube nicht, dass es eine Entsprechung zur Ada Select-Anweisung in Java gibt. Es gibt auch keine Möglichkeit, eine Eingabewarteschlange mit programmierbarer Warteschlangenrichtlinie bereitzustellen. Die Java wait/notify Kombination aktiviert einen wartenden Thread, aber Sie wissen nie welchen. Der Thread, der tatsächlich durch einen Benachrichtigungsbefehl aktiviert wird, basiert auf Rennbedingungen und hat den Effekt, scheinbar zufällig zu sein. Die Analyse zeigt, dass jeder wartende Thread erwartet durch eine Benachrichtigung an einem bestimmten Punkt in der Programmausführung aktiviert werden kann, aber es gibt keine Garantie in Java über die Reihenfolge der Thread-Aktivierung, oder sogar wenn ein bestimmter Thread jemals von einer Wartezeit aktiviert wird Zustand.