(2) 使用Java管道流对象实现互相独立的线程之间的通信。要求: (a)线程1从键盘输入若干行字符串,将字符串输出到管道流;
时间: 2024-10-18 07:24:15 浏览: 14
在Java中,可以使用`PipedInputStream`和`PipedOutputStream`来实现线程间的通信,它们构成了所谓的管道流。这种机制允许两个独立的线程通过管道进行数据交换,而不需要共享任何全局变量或文件。
以下是创建管道并让线程1输入字符串、线程2接收字符串的一个简单示例:
```java
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
public class ThreadCommunication {
private static final int BUFFER_SIZE = 1024; // 字符缓冲大小
public static void main(String[] args) throws Exception {
// 创建管道
PipedInputStream input = new PipedInputStream();
PipedOutputStream output = new PipedOutputStream(input);
// 创建线程1,负责读取用户输入
Thread readerThread = new Thread(() -> {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line;
while ((line = br.readLine()) != null) {
output.write(line.getBytes("UTF-8")); // 将字符串写入管道
output.flush(); // 确保数据已发送
System.out.println("Thread 1 sent: " + line);
}
output.close(); // 关闭输出端口
} catch (Exception e) {
e.printStackTrace();
}
}, "Reader");
// 创建线程2,负责接收和处理数据
Thread writerThread = new Thread(() -> {
byte[] buffer = new byte[BUFFER_SIZE];
try {
while (true) {
int readBytes = input.read(buffer); // 从管道读取数据
if (readBytes <= 0) break; // 如果读取结束,退出循环
String receivedLine = new String(buffer, 0, readBytes, "UTF-8");
System.out.println("Thread 2 received: " + receivedLine);
}
input.close(); // 关闭输入端口
} catch (Exception e) {
e.printStackTrace();
}
}, "Writer");
// 启动线程
readerThread.start();
writerThread.start();
// 等待线程完成
readerThread.join();
writerThread.join();
}
}
```
在这个例子中,线程1作为读者从标准输入读取字符串,并将其写入管道,线程2作为写者从管道读取数据并打印出来。每个线程都在自己的任务范围内运行,互不影响。
阅读全文