两个线程之间的Java“对话”:管道输入/输出流

时间:2011-03-16 16:27:05

标签: java multithreading input pipe

我想知道您认为实现程序的最佳方式是两个线程交换字符串并相互响应。

我无法使用java.nio.Pipe和java.io.PipedInputStream / java.io.PipedOutput.Stream

以下是我想要做的代码示例:

主要课程,设置一切。

public static void main(String[] args) {
        // TODO
        // Create two communication channel, and bind them together

        MyThread t1 = new MyThread(channel1Reader, channel2Writer, 0);
        MyThread t2 = new MyThread(channel2Reader, channel1Writer, 1);

        t1.run();
        t2.run();

    }

线程类:

public class MyThread extends Thread {
    private ? inputStream;
    private ? outputStream;
    private boolean canTalk;
    private int id;

    public MyThread(? inputStream, ? outputStream, boolean isStarting, int id) {
        this.inputStream = inputStream;
        this.outputStream = outputStream;
        this.canTalk = isStarting;
        this.id = id;
    }

    public void run() {
        while(true) {
            if(canTalk) {
                String s = getRandomWord();
                // TODO
                // Write s to the output stream
            }

            // TODO
            // Wait until receiving a String on the input stream
            String s2 = the word I just received
            Log.info("Thread " + id + " received the word '" + s2 + "'");
            canTalk = true;
            Thread.sleep(1000);
        }
    }

有什么想法吗?

谢谢!

3 个答案:

答案 0 :(得分:1)

如果您有一个必须接受输入/输出流的库,PipedInout / OutputStream非常有用。否则是在线程之间交换数据的最不友好的方式之一。

但是,在线程之间交换数据的最简单方法是使用ExecutorService。您可以提交Callable< String>任务到服务并从Future< String>

获得结果

另一种方法是使用多个BlockingQueue< String>但这并没有节省太多,而且缺乏ExecutorService为您提供的功能。

您的示例遇到的问题是,将 作为单个线程实现起来更简单。我建议你看一下最好由多个线程执行的功能。

答案 1 :(得分:1)

你在这里使用

    t1.run();
    t2.run();

这将执行当前线程中两个Thread对象的run方法,并且一个接一个地执行。构造的线程实际上并未启动。

这种方式通信无法工作,因为在写线程写入时尚未启动读取线程,反之亦然。用户

    t1.start();
    t2.start();

这里,或者使用带有Runnable对象的ThreadPool,而不是Thread子类。

答案 2 :(得分:0)

我通常使用Queue,可能由LinkedList支持。

阅读:

synchronized (q) {
    while (q.isEmpty() && !stopSignal) {
        q.wait(3000);
    }
    return q.poll();
}

写:

synchronized (q) {
    q.add(item);
    q.notify();
}