2015-11-03 30 views
8

所以我有這個很簡單JCSP(Java的通信順序進程),其中我試圖寫一個One2OneInt道整數,然後閱讀它的代碼示例。卡住書面方式向JCSP通道

package jcsp; 
import org.jcsp.lang.*; 

public class JCSP { 

public static void main(String[] args) { 

    One2OneChannelInt chan = Channel.one2oneInt(); 
    chan.out().write(5); 

    System.out.println("Written..."); 

    System.out.println(chan.in().read()); 
    } 
} 

看來,值永遠不會被寫入通道和程序只是繼續運行。 「書面...」從不打印出來。

回答

6

於是我瞭解了BlockingQueue及其執行SynchronousQueue。如here所述,SynchronousQueue以類似的方式工作,其中CSP Channels工作。這幫助我意識到我的代碼出了什麼問題。簡而言之,您不能在同一進程中從渠道writereadChannel進程進行通信的方式。

類似於SynchronousQueue'sput()這將等待其他進程調用take()CSP Channel'swrite()這將等待對應read()被調用。區別在於CSP Channels有對象ChannelOutputChannelInput,通過這些對象被寫入並呈紅色。相反,您可以直接撥打puttake,以SynchronousQueue爲例。我個人認爲SynchronousQueue更容易理解,這可能與JCSP不太受歡迎有關。

不過,如果你有興趣我是如何做出JCSP上述代碼的工作,那就是:

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

的問題是通道無緩衝,所以你的電話write()將阻塞直到另一個進程讀取來自頻道。只要另一個進程調用read()'書面...'將被打印出來。

容量爲0的A BlockingQueue表現與JCSP通道類似