【问题标题】:Stuck writing to JCSP channel无法写入 JCSP 频道
【发布时间】:2016-02-03 15:58:37
【问题描述】:

我有一个非常简单的 JCSP(Java 通信顺序进程)代码示例,我在其中尝试将整数写入 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());
    }
}

似乎值永远不会被写入通道并且程序只是继续运行。 “Written...” 永远不会被打印出来。

【问题讨论】:

    标签: java channel


    【解决方案1】:

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

    类似于SynchronousQueue'sput(),它将等待其他进程调用take()CSP Channel'swrite()将等待相应的read()被调用。不同之处在于CSP Channels 具有对象ChannelOutputChannelInput,通过这些对象写入和红色。相反,您可以直接在SynchronousQueue 的实例上调用puttake。就我个人而言,我觉得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();
    }
    

    【讨论】:

      【解决方案2】:

      问题是通道没有缓冲,所以您的write() 调用将阻塞,直到另一个进程从通道读取。只要另一个进程调用read(),就会打印出'Written...'

      容量为 0 的 BlockingQueue 的行为类似于 JCSP 通道

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-01-30
        • 1970-01-01
        • 1970-01-01
        • 2016-09-15
        • 2013-02-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多