Java线程间通信 - PipedReader和PipedWriter

Java线程间通信长期以来一直是一个受欢迎的面试问题。在JDK 1.5版本中,ExecutorService和BlockingQueue带来了另一种更有效的方式,但是管道流方法也值得了解,在某些情况下可能会有用。

目录

什么是管道流
PipedReader和PipedWriter
Java线程间通信示例
摘要

什么是管道流

管道流就像真正的管道管道。你把东西放在管道的一端 - 使用一些方法。然后,您从另一端的管道流中收到相同的东西 - 使用其他一些方法。

它们以FIFO顺序出现先进先出,就像真正的管道管道一样。

PipedReader和PipedWriter

PipedReader Reader类的扩展,用于读取字符流。它的read()方法读取连接的PipedWriter流。同样, PipedWriter是Writer类的扩展,它完成了Reader类收缩的所有内容。

可以通过以下两种方法将writer连接到阅读器:

  1. 使用构造函数PipedWriter(PipedReader pr)
  2. 使用connect(PipedReader pr)方法

一旦通过上述任何方式连接,任何线程都可以使用write(....)方法在流中写入数据,并且数据将可供读取器使用并且可以使用read()方法读取。

Java线程间通信示例

下面给出的Java程序创建了两个线程。一个线程负责写入流,第二个线程只读取数据以在控制台中打印它们。

PipeReaderThread.java

public class PipeReaderThread implements Runnable

{

    PipedReader pr;

    String name = null;

 

    public PipeReaderThread(String name, PipedReader pr)

    {

        this.name = name;

        this.pr = pr;

    }

 

    public void run()

    {

        try {

            // continuously read data from stream and print it in console

            while (true) {

                char c = (char) pr.read(); // read a char

                if (c != -1) { // check for -1 indicating end of file

                    System.out.print(c);

                }

            }

        catch (Exception e) {

            System.out.println(" PipeThread Exception: " + e);

        }

    }

}

PipeWriterThread.java

public class PipeWriterThread implements Runnable

{

    PipedWriter pw;

    String name = null;

 

    public PipeWriterThread(String name, PipedWriter pw) {

        this.name = name;

        this.pw = pw;

    }

 

    public void run() {

        try {

            while (true) {

                // Write some data after every two seconds

                pw.write("Testing data written...n");

                pw.flush();

                Thread.sleep(2000);

            }

        catch (Exception e) {

            System.out.println(" PipeThread Exception: " + e);

        }

    }

}

PipedCommunicationTest.java

package multiThread;

 

import java.io.*;

 

public class PipedCommunicationTest

{

    public static void main(String[] args)

    {

        new PipedCommunicationTest();

    }

 

    public PipedCommunicationTest()

    {

        try

        {

            // Create writer and reader instances

            PipedReader pr = new PipedReader();

            PipedWriter pw = new PipedWriter();

 

            // Connect the writer with reader

            pw.connect(pr);

 

            // Create one writer thread and one reader thread

            Thread thread1 = new Thread(new PipeReaderThread("ReaderThread", pr));

 

            Thread thread2 = new Thread(new PipeWriterThread("WriterThread", pw));

 

            // start both threads

            thread1.start();

            thread2.start();

 

        }

        catch (Exception e)

        {

            System.out.println("PipeThread Exception: " + e);

        }

    }

}

节目输出:

安慰

Testing data written...

Testing data written...

Testing data written...

摘要

  • 如果没有创建并连接某种类型的读取器,则无法写入管道。换句话说,两端必须存在并且已经连接以使写入端工作。
  • 完成写入管道后,无法切换到最初未连接管道的其他阅读器。
  • 如果关闭阅读器,则无法从管道读回。但是,您可以成功关闭写入结束,并仍然可以从管道中读取。
  • 如果写入它的线程结束,则无法从管道读回。

你可能感兴趣的:(java)