java - “管道未连接”到 Java Callable 子节点

标签 java pipe callable

我想要一个管道用于从父亲到线程池中的可调用对象进行通信。然而,管道从一开始就显示为“未连接”。如果我改用 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/

相关文章:

c - 如何获取execlp的退出代码

c++ - 为什么我不能通过管道从两个 execl 调用输出?

python - 将原始 OpenCV 图像通过管道传输到 FFmpeg

Ruby:BigDecimal:同时是一个类和一个方法?

用于从模板解析的 Java 库(如反向 Freemarker)?

java - 如何判断数组中任意值的总和是否等于n

java - 通过使用下面提到的以下命令来编译Java代码

python - 如何使用 Python @singledispatch 注册 Typing.Callable?

JAVA:如何在特定时间后停止函数的执行?

java - 在java中对未知维数数组的第一列进行排序