坚持写入 JCSP 频道
Stuck writing to JCSP channel
我有这个非常简单的 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..." 永远不会打印出来。
所以我了解了 BlockingQueue
及其实现 SynchronousQueue
。正如 here 所述,SynchronousQueue
的工作方式与 CSP Channels
的工作方式类似。这帮助我意识到我的代码出了什么问题。简而言之,您不能在同一进程中从频道 write
和 read
。 Channel
是 进程 进行通信的方式。
类似于SynchronousQueue's
put()
会等待其他进程调用take()
,CSP Channel's
write()
会等待相应的read()
被称为。不同的是CSP Channels
有对象ChannelOutput
和ChannelInput
,对象是通过对象写的,红色的。相反,您可以直接在 SynchronousQueue
的实例上调用 put
和 take
。我个人觉得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();
}
问题是通道没有缓冲,因此您的 write()
调用将阻塞,直到另一个进程从通道读取数据。一旦另一个进程调用 read()
,'Written...' 将被打印出来。
容量为 0 的 BlockingQueue
的行为类似于 JCSP 通道
我有这个非常简单的 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..." 永远不会打印出来。
所以我了解了 BlockingQueue
及其实现 SynchronousQueue
。正如 here 所述,SynchronousQueue
的工作方式与 CSP Channels
的工作方式类似。这帮助我意识到我的代码出了什么问题。简而言之,您不能在同一进程中从频道 write
和 read
。 Channel
是 进程 进行通信的方式。
类似于SynchronousQueue's
put()
会等待其他进程调用take()
,CSP Channel's
write()
会等待相应的read()
被称为。不同的是CSP Channels
有对象ChannelOutput
和ChannelInput
,对象是通过对象写的,红色的。相反,您可以直接在 SynchronousQueue
的实例上调用 put
和 take
。我个人觉得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();
}
问题是通道没有缓冲,因此您的 write()
调用将阻塞,直到另一个进程从通道读取数据。一旦另一个进程调用 read()
,'Written...' 将被打印出来。
容量为 0 的 BlockingQueue
的行为类似于 JCSP 通道