所以我有这个非常简单的 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());
}
}
似乎价值永远不会写在频道上,程序就会继续运行。 "写完......" 永远不会打印出来。
答案 0 :(得分:6)
所以我了解了BlockingQueue
及其实现SynchronousQueue
。如上所述here,SynchronousQueue
的工作方式类似于CSP Channels
。这让我意识到我的代码出了什么问题。简而言之,您不能在同一过程中通道write
和read
。 Channel
是进程进行沟通的方式。
与等待其他流程调用SynchronousQueue's
的{{1}} put()
类似,take()
CSP Channel's
会等待相应的write()
叫做。不同之处在于read()
具有对象CSP Channels
和ChannelOutput
,对象通过这些对象写入红色。相反,您可以直接在ChannelInput
的实例上致电put
和take
。就个人而言,我发现SynchronousQueue
更容易理解,这可能与SynchronousQueue
不太受欢迎有关。
但是,如果您对我在JCSP中如何使上述代码有效感兴趣,请点击此处:
JCSP
答案 1 :(得分:0)
问题是通道是无缓冲的,因此您的write()
调用将阻塞,直到另一个进程从通道读取。只要另一个流程调用read()
,就会打印出'已写...'。
容量为0的BlockingQueue
与JCSP频道的行为类似