从基本的安装开始 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 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘