当前位置:  技术问答>java相关

多个线程用一个管道通信,不是异常就是无限等待,请指点。

    来源: 互联网  发布时间:2015-09-25

    本文导语:  //  初学 java,练习多线程, // //  程序说明:  三个线程用一个管道通信,两个写入管道的线程 t 和 tt , //              主线程 m 读取管道。 //              t 和 tt 中都没有关闭管道的写入...

//  初学 java,练习多线程,
//
//  程序说明:  三个线程用一个管道通信,两个写入管道的线程 t 和 tt ,
//              主线程 m 读取管道。
//              t 和 tt 中都没有关闭管道的写入端。
//
//  运行结果:  当 t 和 tt 都结束之后,m 产生 IOException
//
//  请问:      1、why? 为什么不是 m 无限等待?
//              2、注释掉 语句1 和 语句2 ,结果似乎主线程无限阻塞,why?
//              3、我应该怎样关闭管道的写入端?

import java.io.*;

class t extends Thread {
    public void run() {
        try {
            m.to_pipe.write(7); // 语句1
            sleep(3*1000);
            System.out.println("t finish");
        } catch( Exception e) { e.printStackTrace(); }
    }
}

class tt extends Thread {
    public void run() {
        try {
            m.to_pipe.write(77);  // 语句2
            sleep(10*1000);
            System.out.println("tt finish");
        } catch( Exception e) { e.printStackTrace(); }
    }
}

class m {
    static PipedOutputStream to_pipe;
    static PipedInputStream from_pipe;
    public static void main( String[] args ) {
        try {
            to_pipe = new PipedOutputStream();
            from_pipe = new PipedInputStream(to_pipe);
            new t().start();
            new tt().start();
            for( int i; (i=from_pipe.read()) != -1; ) System.out.println( i );
        } catch( Exception e ) { e.printStackTrace(); }
    }
}

|
看一下JDK Doc:
public int read()
         throws IOExceptionReads the next byte of data from this piped input stream. The value byte is returned as an int in the range 0 to 255. If no byte is available because the end of the stream has been reached, the value -1 is returned. This method blocks until input data is available, the end of the stream is detected, or an exception is thrown. If a thread was providing data bytes to the connected piped output stream, but the thread is no longer alive, then an IOException is thrown. 

Specified by:
read in class InputStream
Returns:
the next byte of data, or -1 if the end of the stream is reached. 
Throws: 
IOException - if the pipe is broken.

这种情形说的很清楚

|
public void run() {
try {

M.to_pipe.write(77);  // 语句2
sleep(10*1000);
System.out.println("tt finish");
M.to_pipe.close();
} catch( Exception e) { e.printStackTrace(); }
}
重写如上:加上"M.to_pipe.close();"
测试通过

|
没有flush

|
主要原因是从名称上看PipedOutputStream() PipedInPutStream();的内部输入输出方向同正常的输入输出方向是相反的,而输入流的read()方法又一直等待实际作为前端输入流的管道输出流关闭所以当手动关闭时就可以了。

    
 
 

您可能感兴趣的文章:

  • 一个进程中的多个线程不会被调度到一台机器中的多个cup并行执行吗?
  • POSIX线程中多个线程可以共用一个属性吗?
  • 有什么方法使多个线程进入休眠,并唤醒其中一个??
  • 如果多个线程同时select同一个套接字会怎么样?可以这样吗?
  • 请问多个线程同时读写同一文件的操作是否安全?
  • 一个进程分离出多个线程后cpu时间分配问题
  • 如果父进程有多个线程,那么它的子进程也该拥有这些线程
  • LINUX下访问oracle时sleeping的线程过多,达到300多个,造成系统拥堵!
  • 求教 Linux多个线程 可不可以同时调用一个函数
  • 请大家讨论,来者有分,java中多个线程之间共享数据的方法都有哪些?
  • linux下面如何让线程等待多个事件?
  • 同多个线程通过同一个socket发送数据,操作系统底层会同步每个发送操作吗
  • 弱弱的问:关于多个线程(就10分了,多谢了)
  • 求助!!!多线程+多个epoll_wait问题
  • linux下一个进程下面有多个线程的栈切换的问题,望高人指点下。
  • 在多核CPU下,同一进程下的多个线程可以并行运行吗?
  • UNIX中多个线程同时捕捉信号,信号由那个线程捕捉到?
  • 在linux7.3下多个线程使用 pthread_cond_t 的一个小问题。
  • 调用同一个函数建立的多个线程,如何使用函数的数据?
  • 怎么循环建立多个线程
  • 初学linux,多个c文件怎么编译?附上我 写的 程序,请大侠指点~
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 多个进程同时写一个管道会不会有问题???
  • Uploadify 'uploadify.php'存在多个输入验证漏洞
  • 我写了个linux下的网络程序,程序在多个电脑间通信,但是我没有多个电脑,怎么调试这样的程序啊?
  • PHP 'ext/soap/php_xml.c'不完整修复存在多个任意文件泄露漏洞
  • 我写了个linux下的网络程序,程序在多个电脑间通信,但是我没有多个电脑,怎么调试这样的程序啊? iis7站长之家
  • linux下grep命令实现查找多个关键字(与关系和或关系)
  • 一个物理服器一个公网IP,多个虚拟机,多个域名
  • 多jdk环境下安装多个tomcat冲突解决配置方法
  • Apache + tomact 配多个域名 对 多个目录。
  • vim管理多个文件
  • 一个LINUX的驱动程序中,能不能注册多个中断?
  • 300分!查错,解决多个生产者和多个消费者问题 高手进!分不够想法子再加!
  • 如何使一个按钮响应多个事件?过来侃侃@!!!!
  • linux系统支持多个网卡同时工作吗?
  • linux字符界面怎么同时运行多个程序?
  • apache中使用mod_gnutls模块实现多个SSL站点配置(多个HTTPS协议的虚拟主机)
  • 请问如何实现多个并行的定时器?
  • 请教POSIX问题:一个进程中,可以有多个互斥锁麽?
  • 请问如何在一个文件系统修改源码管理并使用多个卷(存储设备)
  • 用tar命令如何解压多个文件
  • linux下如何做象windows下的OnTimer一样,多个定时器用一个回调函数!!!!!!!
  • rsync客户端如何从远程计算机上传输多个文件到本地计算机?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3