从基本的安装开始 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,同时有数据的时候触发阻塞,让线程开始处理读取数据,操作系统会帮你处理这些。

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

报告相同问题?

悬赏问题

  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码