';管道未连接';给一个Java可调用的儿子

';管道未连接';给一个Java可调用的儿子,java,pipe,callable,Java,Pipe,Callable,我想要一个管道,用于从父亲到线程池中的可调用对象的通信。但是,管道从一开始就显示为“未连接”。如果改用Runnable,问题就会消失 我提取了一个简化的示例: public class Test { public static void main (String[] args) throws IOException, InterruptedException { ExecutorService es = Executors.newCachedThreadPoo

我想要一个管道,用于从父亲到线程池中的可调用对象的通信。但是,管道从一开始就显示为“未连接”。如果改用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();
    }
}
有什么帮助吗?
谢谢大家!

在调用invokeAll()之前创建PipedOutStream。

我发现了错误,但我不理解症状:-/

错误在于我忘记了“invokeAll”只有在所有线程都完成时才会返回:所以“废话废话”永远不会被发送,这不是我所期望的。但我不明白为什么儿子会有例外

解决方案只是更换线路:

    List<Callable<Object>> ls = new LinkedList<>(); ls.add(x); es.invokeAll(ls);
或者使用适当的while循环来处理runnable的集合,就像在我的实际情况中一样(还没有尝试…)


EJP的(错误)答案给了我一个相关的线索,因为在这种情况下,没有欺骗症状,只是一个意外的结果。

这没有错。在使用管道之前,你必须先把它连接起来。您没有这样做,因此出现了“管道未连接”错误。QEDY您可以写入尚未连接的管道:内容仍保留在管道中。顺便说一下,这与我的真实情况有关。给出的示例只是将错误的“invokeAll”替换为“submit”(已测试)。
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)
    List<Callable<Object>> ls = new LinkedList<>(); ls.add(x); es.invokeAll(ls);
    es.submit(x);