Ich habe also dieses wirklich einfache JCSP (Java Communicating Sequential Processes) Codebeispiel, in dem ich versuche, eine ganze Zahl in einen One2OneInt Kanal zu schreiben und sie dann zu lesen .
%Vor%Es scheint, dass der Wert niemals auf den Kanal geschrieben wird und das Programm läuft einfach weiter. "Geschrieben ..." wird niemals ausgedruckt.
Also habe ich von BlockingQueue
und seiner Implementierung SynchronousQueue
erfahren. Wie bereits erwähnt hier funktioniert SynchronousQueue
in ähnlicher Weise welche CSP Channels
arbeiten. Dies half mir zu erkennen, was mit meinem Code nicht stimmte. Einfach gesagt, Sie können nicht write
und read
von Kanal in demselben Prozess. Channel
ist eine Möglichkeit für Prozesse zu kommunizieren.
Ähnlich wie SynchronousQueue's
put()
, das darauf wartet, dass ein anderer Prozess take()
aufruft, CSP Channel's
write()
, der darauf wartet, dass die entsprechende read()
aufgerufen wird. Der Unterschied besteht darin, dass CSP Channels
über die Objekte ChannelOutput
und ChannelInput
verfügt, über die Objekte geschrieben und rot geschrieben werden. Umgekehrt können Sie put
und take
direkt auf der Instanz von SynchronousQueue
aufrufen. Persönlich finde ich SynchronousQueue
viel einfacher zu verstehen, was wahrscheinlich darauf zurückzuführen ist, dass JCSP
nicht sehr beliebt ist.
Wenn Sie interessiert sind, wie ich den obigen Code in JCSP implementiert habe, hier ist es:
%Vor% Das Problem besteht darin, dass der Kanal nicht gepuffert ist. Ihr write()
-Aufruf blockiert also, bis ein anderer Prozess den Kanal liest. Sobald ein anderer Prozess read()
aufruft, wird 'Geschrieben ...' ausgedruckt.
A BlockingQueue
mit einer Kapazität von 0 verhält sich ähnlich wie ein JCSP-Kanal