<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # Java 線程間通信 – `PipedReader`和`PipedWriter` > 原文: [https://howtodoinjava.com/java/multi-threading/inter-thread-communication-using-piped-streams-in-java/](https://howtodoinjava.com/java/multi-threading/inter-thread-communication-using-piped-streams-in-java/) Java 線程間通信在很長一段時間以來一直是熱門的[面試問題](https://howtodoinjava.com/java-interview-questions/)。 在 JDK 1.5 版本中,[`ExecutorService`](https://howtodoinjava.com/java/multi-threading/java-executor-framework-tutorial-and-best-practices/)和[`BlockingQueue`](https://howtodoinjava.com/java/multi-threading/how-to-use-blockingqueue-and-threadpoolexecutor-in-java/)[帶來了另一種更有效的實現方式](//howtodoinjava.com/java-5/how-to-use-blockingqueue-and-threadpoolexecutor-in-java/ "How to use BlockingQueue and ThreadPoolExecutor in java"),但管道流方法也值得了解,在某些情況下可能有用。 ```java Table of contents What are piped streams PipedReader and PipedWriter Java inter-thread communication example Summary ``` ## 什么是管道流 **管道流**就像真實的管道一樣。 您可以使用某些方法將事物一端放入管道中。 然后,您可以使用其他方法從另一端的管道流中收到相同的信息。 它們以 [**FIFO 順序**](https://en.wikipedia.org/wiki/FIFO "fifo")的先入先出的方式出現,就像從實際的管道中一樣。 ## `PipedReader`和`PipedWriter` [**`PipedReader`**](https://docs.oracle.com/javase/7/docs/api/java/io/PipedReader.html)是[**`Reader`**](https://docs.oracle.com/javase/7/docs/api/java/io/Reader.html "Reader")類的擴展,用于讀取字符流。 它的`read()`方法讀取連接的`PipedWriter`的流。 同樣,[**`PipedWriter`**](https://docs.oracle.com/javase/7/docs/api/java/io/PipedWriter.html) 是`Writer`類的擴展,它執行`Reader`類所收縮的所有工作。 可以通過以下兩種方法將作家連接到讀者: 1. 使用構造器`PipedWriter(PipedReader pr)` 2. 使用`connect(PipedReader pr)`方法 通過上述任何一種方式連接后,任何線程都可以使用`write(....)`方法在流中寫入數據,并且數據將可供讀取器使用,并且可以使用`read()`方法進行讀取。 ## Java 線程間通信示例 下面給出的 Java 程序創建兩個線程。 一個線程負責寫入流,第二個線程僅讀取數據以在控制臺中打印它們。 ```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); } } } ``` ```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); } } } ``` ```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); } } } ``` 程序輸出: ```java Testing data written... Testing data written... Testing data written... ``` ## 總結 * 您必須先創建某種類型的讀取器并將其連接,然后才能寫入管道。 換句話說,兩個端必須存在并且已經連接,以使寫入端正常工作。 * 完成寫入管道后,您將無法切換到最初未連接管道的其他讀取器。 * 如果關閉閱讀器,則無法從管道中讀回。 但是,您可以成功關閉寫入端,并且仍然可以從管道讀取數據。 * 如果寫入管道的線程結束,則無法從管道讀回。 學習愉快!
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看