我想要一个管道用于从父亲到线程池中的可调用对象进行通信。然而,管道从一开始就显示为“未连接”。如果我改用 Runnable,问题就会消失......
我提取了一个简化的示例:
public class Test {
public static void main (String[] args) throws IOException, InterruptedException {
ExecutorService es = Executors.newCachedThreadPool();
PipedInputStream a = new PipedInputStream();
// create a list of Callables (one element) and invoke them
Son x=new Son(a);
List<Callable<Object>> ls = new LinkedList<>(); ls.add(x); es.invokeAll(ls);
// create a line oriented pipe
PrintWriter toSon =
new PrintWriter(
new BufferedWriter(
new OutputStreamWriter(
new PipedOutputStream(a))),true);
//write anything
toSon.println("blah blah blah");
//here you can add a Thread.sleep, no change
toSon.close();
}
}
儿子:
public class Son implements Callable<Object> {
PipedInputStream x;
public Son(PipedInputStream x) {
this.x=x;
}
public Object call() {
BufferedReader b = new BufferedReader(
new InputStreamReader(
new BufferedInputStream(x)));
try {
System.out.println(">"+b.readLine());
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
以下是堆栈跟踪,对应于子中的 readln:
java.io.IOException: Pipe not connected
at java.io.PipedInputStream.read(PipedInputStream.java:306)
at java.io.PipedInputStream.read(PipedInputStream.java:378)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:273)
at java.io.BufferedInputStream.read(BufferedInputStream.java:334)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:283)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:325)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:177)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at java.io.BufferedReader.fill(BufferedReader.java:154)
at java.io.BufferedReader.readLine(BufferedReader.java:317)
at java.io.BufferedReader.readLine(BufferedReader.java:382)
at prova.Son.call(Son.java:23)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
有什么帮助吗? 谢谢!
最佳答案
在调用invokeAll()之前创建PipedOutputStream。
关于java - “管道未连接”到 Java Callable 子节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24694424/