写入JCSP频道

Sch*_*izo 7 java channel

所以我有这个非常简单的JCSP(Java Communicating Sequential Processes)代码示例,其中我试图将一个整数写入One2OneInt通道然后读取它.

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());
    }
}
Run Code Online (Sandbox Code Playgroud)

似乎价值永远不会写在频道上,程序就会继续运行.从未打印出"书面......".

Sch*_*izo 6

所以我了解了BlockingQueue它及其实现SynchronousQueue.如前所述这里,SynchronousQueue工作在其中类似的方式CSP Channels工作.这让我意识到我的代码出了什么问题.简单地说,你不能writeread来自同一过程的渠道.Channel流程进行沟通的方式.

同样SynchronousQueue's put()会等待其他进程调用take(),CSP Channel's write()这将等待相应read()的被调用.不同之处在于CSP Channels具有对象ChannelOutput以及ChannelInput通过其写入对象和红色.相反,你可以打电话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();
}
Run Code Online (Sandbox Code Playgroud)