从基本的安装开始 2017-01-06 03:59 采纳率: 87.5%
浏览 848
已采纳

JAVA多线程之间使用管道进行通讯的小问题

在看书时遇到的一个小问题

他说,当没有数据被写入时,读线程阻塞在length=in.read(buffer),
这里的阻塞是说线程一直执行length=in.read(buffer),直到length!=-1,还得是说线程被wait或sleep了

 package test6;

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

//线程之间通过管道传递数据
public class Test {

    public static void main(String[] args) throws IOException {
        PipedInputStream input = new PipedInputStream();
        PipedOutputStream out = new PipedOutputStream();
        input.connect(out);

        Test test = new Test();
        ThreadA threadA = test.new ThreadA(out);
        ThreadB threadB = test.new ThreadB(input);
        threadA.start();
        threadB.start();


    }

    //向管道内写入数据的线程
    public class ThreadA extends Thread{

        private PipedOutputStream out; 

        public ThreadA(PipedOutputStream out) {
            this.out = out;
        }
        @Override
        public void run() {
            while(true){
                System.out.println("写数据线程在执行");
                try {
                    out.write("你好".getBytes());
                    Thread.sleep(1000);
                } catch (Exception e) {
                    e.printStackTrace();
                }

            }
        }
    }

    //向管道内读数据的线程
    public class ThreadB extends Thread{
        private PipedInputStream in;
        public ThreadB(PipedInputStream in) {
            this.in= in;
        }
        @Override
        public void run() {
            while(true){
                System.out.println("读数据线程在执行");
                try {
                    byte[] buffer = new byte[1024];
                    int length = 0;
                    while(-1 != (length = in.read(buffer))){
                        System.out.println(new String(buffer, 0, length));
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }


}
  • 写回答

1条回答

  • oyljerry 2017-01-06 04:49
    关注

    阻塞一般是wait,系统会切换CPU,同时有数据的时候触发阻塞,让线程开始处理读取数据,操作系统会帮你处理这些。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 opencv 无法读取视频
  • ¥15 用matlab 实现通信仿真
  • ¥15 按键修改电子时钟,C51单片机
  • ¥60 Java中实现如何实现张量类,并用于图像处理(不运用其他科学计算库和图像处理库))
  • ¥20 5037端口被adb自己占了
  • ¥15 python:excel数据写入多个对应word文档
  • ¥60 全一数分解素因子和素数循环节位数
  • ¥15 ffmpeg如何安装到虚拟环境
  • ¥188 寻找能做王者评分提取的
  • ¥15 matlab用simulink求解一个二阶微分方程,要求截图