通过管道进行线程间通信:字节流。字符流的用法及API类似

简介: 管道流(PipedStream)可以用于不同线程间直接传送数据。一个线程发送数据到输出管道,另一个线程从输入管道中读取数据。通过使用管道,实现不同线程间的通信,而无须借助于类似临时文件之类的东西。 package thread.

管道流(PipedStream)可以用于不同线程间直接传送数据。
一个线程发送数据到输出管道,另一个线程从输入管道中读取数据。通过使用管道,实现不同线程间的通信,而无须借助于类似临时文件之类的东西。

package thread.communicate;

import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;

/*2015-11-19*/
public class CommunicateWithPipedStream {
    public static void main(String[] args) {
        try {
            PipedOutputStream out = new PipedOutputStream();
            DataWriter writer = new DataWriter(out);
            PipedInputStream in = new PipedInputStream();
            DataReader reader = new DataReader(in);
            // out.connect(in);
            in.connect(out);
         new Thread(writer, "Writer").start();
            new Thread(reader, "Reader").start();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

class DataWriter implements Runnable {
    private PipedOutputStream _out;

    public DataWriter(PipedOutputStream out) {
        super();
        this._out = out;
    }

    @Override
    public void run() {
        write();
    }

    public void write() {
        System.out.println(Thread.currentThread() + "Start write....");
        try {
            for (int i = 0; i < 20; i++) {
                String outStr = "" + (i + 1);
                System.out.println(Thread.currentThread() + outStr);
                _out.write(outStr.getBytes());
            }
            _out.close();

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

}

class DataReader implements Runnable {

    private PipedInputStream _in;

    public DataReader(PipedInputStream in) {
        _in = in;
    }

    @Override
    public void run() {
        read();
    }

    public void read() {
        try {
            System.out.println(Thread.currentThread() + "Start read....");
            byte[] byteArray = new byte[20];
            int readLength = _in.read(byteArray);
            while (readLength != -1) {
                String newData = new String(byteArray, 0, readLength);
                System.out.println(Thread.currentThread() + newData);
                readLength = _in.read(byteArray);
            }
            System.out.println();
            _in.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}


输出:

Thread[Writer,5,main]Start write....
Thread[Writer,5,main]1
Thread[Reader,5,main]Start read....
Thread[Writer,5,main]2
Thread[Reader,5,main]1
Thread[Reader,5,main]2
Thread[Writer,5,main]3
Thread[Writer,5,main]4
Thread[Writer,5,main]5
Thread[Writer,5,main]6
Thread[Writer,5,main]7
Thread[Writer,5,main]8
Thread[Writer,5,main]9
Thread[Writer,5,main]10
Thread[Writer,5,main]11
Thread[Writer,5,main]12
Thread[Writer,5,main]13
Thread[Writer,5,main]14
Thread[Writer,5,main]15
Thread[Writer,5,main]16
Thread[Writer,5,main]17
Thread[Writer,5,main]18
Thread[Writer,5,main]19
Thread[Writer,5,main]20
Thread[Reader,5,main]34567891011121314151
Thread[Reader,5,main]617181920

 





相关文章
|
2月前
|
Java 调度
[Java]线程生命周期与线程通信
本文详细探讨了线程生命周期与线程通信。文章首先分析了线程的五个基本状态及其转换过程,结合JDK1.8版本的特点进行了深入讲解。接着,通过多个实例介绍了线程通信的几种实现方式,包括使用`volatile`关键字、`Object`类的`wait()`和`notify()`方法、`CountDownLatch`、`ReentrantLock`结合`Condition`以及`LockSupport`等工具。全文旨在帮助读者理解线程管理的核心概念和技术细节。
39 1
[Java]线程生命周期与线程通信
|
5月前
|
Java
实现Java多线程中的线程间通信
实现Java多线程中的线程间通信
|
25天前
|
Java
JAVA多线程通信:为何wait()与notify()如此重要?
在Java多线程编程中,`wait()` 和 `notify()/notifyAll()` 方法是实现线程间通信的核心机制。它们通过基于锁的方式,使线程在条件不满足时进入休眠状态,并在条件满足时被唤醒,从而确保数据一致性和同步。相比其他通信方式,如忙等待,这些方法更高效灵活。 示例代码展示了如何在生产者-消费者模型中使用这些方法实现线程间的协调和同步。
33 3
|
2月前
|
安全 Java
Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧
【10月更文挑战第20天】Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧,包括避免在循环外调用wait()、优先使用notifyAll()、确保线程安全及处理InterruptedException等,帮助读者更好地掌握这些方法的应用。
20 1
|
2月前
|
安全 Java 开发者
Java多线程中的`wait()`、`notify()`和`notifyAll()`方法,探讨了它们在实现线程间通信和同步中的关键作用
本文深入解析了Java多线程中的`wait()`、`notify()`和`notifyAll()`方法,探讨了它们在实现线程间通信和同步中的关键作用。通过示例代码展示了如何正确使用这些方法,并分享了最佳实践,帮助开发者避免常见陷阱,提高多线程程序的稳定性和效率。
39 1
|
2月前
|
Java
在Java多线程编程中,`wait()` 和 `notify()/notifyAll()` 方法是线程间通信的核心机制。
在Java多线程编程中,`wait()` 和 `notify()/notifyAll()` 方法是线程间通信的核心机制。它们通过基于锁的方式,使线程在条件不满足时进入休眠状态,并在条件成立时被唤醒,从而有效解决数据一致性和同步问题。本文通过对比其他通信机制,展示了 `wait()` 和 `notify()` 的优势,并通过生产者-消费者模型的示例代码,详细说明了其使用方法和重要性。
28 1
|
2月前
|
Java
|
2月前
多线程通信和同步的方式有哪些?
【10月更文挑战第6天】
104 0
|
4月前
|
移动开发 数据挖掘 API
HTML5 中 Web Workers API 的用法
【8月更文挑战第24天】
53 0
|
4月前
|
存储 安全 Java
【多线程面试题 七】、 说一说Java多线程之间的通信方式
Java多线程之间的通信方式主要有:使用Object类的wait()、notify()、notifyAll()方法进行线程间协调;使用Lock接口的Condition的await()、signal()、signalAll()方法实现更灵活的线程间协作;以及使用BlockingQueue作为线程安全的队列来实现生产者和消费者模型的线程通信。