So erfuhr ich über BlockingQueue
und seine Implementierung SynchronousQueue
. Wie gesagt, funktioniert here, SynchronousQueue
in ähnlicher Weise, in der CSP Channels
arbeiten. Dies half mir zu erkennen, was mit meinem Code nicht stimmte. Einfach gesagt, können Sie nicht write
und read
von Kanal in demselben Prozess. Channel
ist Weg für Prozesse zu kommunizieren.
Ähnlich SynchronousQueue's
put()
, die warten, für andere Verfahren take()
zu nennen, CSP Channel's
write()
, die für entsprechende read()
warten zu nennen. Der Unterschied ist, dass CSP Channels
Objekte ChannelOutput
und ChannelInput
haben, durch die Objekte geschrieben und rot geschrieben werden. Umgekehrt können Sie put
und take
direkt auf Instanz SynchronousQueue
aufrufen. Persönlich finde ich SynchronousQueue
viel leichter zu verstehen, was wahrscheinlich JCSP
nicht sehr beliebt ist.
Dennoch, wenn Sie daran interessiert sind, wie ich die obige Code Arbeit in JCSP gemacht, hier ist es:
public static class Process1 implements CSProcess {
private ChannelOutputInt output;
public Process1(ChannelOutputInt out) {
output = out;
}
@Override
public void run() {
for (int i = 0; i < 1; i++) {
System.out.println("Written...");
output.write(5);
}
output.write(-1);
}
}
public static class Process2 implements CSProcess {
private ChannelInputInt input;
public Process2(ChannelInputInt in) {
input = in;
}
@Override
public void run() {
int x = 0;
while ((x = input.read()) > 0) {
System.out.println(x);
}
}
}
public static void main(String[] args) {
One2OneChannelInt chan = Channel.one2oneInt();
Process1 process1 = new Process1(chan.out());
Process2 process2 = new Process2(chan.in());
Parallel parallel = new Parallel();
parallel.addProcess(process1);
parallel.addProcess(process2);
parallel.run();
}