2015-11-03 8 views
8

So habe ich den wirklich einfache JCSP (Java Sequential Processes Kommunikation) Codebeispiel, in dem ich versuche, eine ganze Zahl zu einem One2OneInt Kanal zu schreiben und es dann lesen.stuck Schriftfelter zu JCSP Kanal

Es scheint, dass Wert nie auf dem Kanal geschrieben wird und Programm läuft nur weiter. "Geschrieben ..." wird nie ausgedruckt.

Antwort

6

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'sput(), die warten, für andere Verfahren take() zu nennen, CSP Channel'swrite(), 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(); 
} 
0

Das Problem ist der Kanal ungepufferte, so dass Ihr write() Anruf blockiert, bis ein anderer Prozess liest aus dem Kanal. Sobald ein anderer Prozess read(), aufruft, wird 'Geschrieben ...' ausgedruckt.

Ein BlockingQueue mit einer Kapazität von 0 verhält sich ähnlich wie ein JCSP-Kanal