我有这个非常简单的 JCSP (Java通信顺序过程)代码示例,在该示例中,我试图将一个整数写入One2OneInt channel ,然后读取它。

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());
    }
}

似乎永远不会在 channel 上写入值,并且程序只会继续运行。 “已写...” 从未打印出来。

最佳答案

因此,我了解了BlockingQueue及其实现SynchronousQueue。如here所述,SynchronousQueue的工作方式与CSP Channels相似。这帮助我意识到我的代码出了什么问题。简而言之,您不能在同一过程中从 channel writereadChannel进行通信的方式。

类似于SynchronousQueue's put()将等待其他进程调用take()CSP Channel's write()将等待相应的read()被调用。区别在于CSP Channels具有对象ChannelOutputChannelInput,通过这些对象可以将对象写入并变为红色。相反,您可以直接在put实例上调用takeSynchronousQueue。就个人而言,我发现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();
}

关于java - 卡住到JCSP channel ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33500139/

10-10 19:54