问题描述
最近看到管道这里,自己写了个用管道来实现两个线程通信的程序,但是不知道为什么第一次通信可以成功,写线程可以写入,读线程可以读出,第二次就出现异常,异常信息是Readenddead。看网上很多人讲是因为第二次通信时读线程已经死亡。请问如何能够用管道实现多次通信?
解决方案
解决方案二:
while能解决吗不过我发现用管道流在两个线程间来回传递数据,效率非常低,不知道的还以为加了延迟
解决方案三:
我就是想知道你是怎么实现的。。代码。。。就像我说我的代码总是报异常空指针一样,你知道大体上为什么会出错,但是你肯定不会知道哪里出的错。。
解决方案四:
引用2楼AA5279AA的回复:
我就是想知道你是怎么实现的。。代码。。。就像我说我的代码总是报异常空指针一样,你知道大体上为什么会出错,但是你肯定不会知道哪里出的错。。
不好意思,不太熟悉CSDN的规则,我的代码如下:
importjava.io.*;importjava.util.Random;classproducerextendsThread{DataOutputStreamd1;inti=0;Randomr=newRandom();producer(OutputStreamout){d1=newDataOutputStream(out);}publicvoidrun(){//System.out.println("producer");try{while(i<10){doublenum=r.nextDouble()*10;System.out.println("thenumis"+num);d1.writeDouble(num);d1.flush();i++;sleep(500);}}catch(IOExceptione){System.out.println("thisisaoutputIOExecption");e.printStackTrace();}catch(InterruptedExceptione){System.out.println("thisisainterruprException");//e.printStackTrace();}}}classconsumerextendsThread{DataInputStreamd2;intcount=0;doublesum=0;consumer(InputStreamin){d2=newDataInputStream(in);}publicvoidrun(){try{doublenum=d2.readDouble();sum+=num;count++;System.out.println("sumis"+sum);sleep(1000);}catch(IOExceptione){System.out.println("thisisainputIOException");e.printStackTrace();}catch(InterruptedExceptione){e.printStackTrace();}}}publicclassPiple{publicstaticvoidmain(String[]args){try{PipedInputStreamp1=newPipedInputStream();PipedOutputStreamp2=newPipedOutputStream(p1);producerp=newproducer(p2);consumerc=newconsumer(p1);p.start();c.start();Thread.sleep(5000);p.stop();c.stop();}catch(IOExceptione){System.out.println("thisismainfunctionException1");e.printStackTrace();}catch(InterruptedExceptione){}}}
解决方案五:
中间consumer的延迟也是500,我改过代码,忘记改这里了,但是修改过以后还是会出现:java.io.IOException:Readenddead的问题,初学JAVA,麻烦各位帮我一下。
解决方案六:
刚学会贴代码,我的代码是这样的:importjava.io.*;importjava.util.Random;classproducerextendsThread{DataOutputStreamd1;inti=0;Randomr=newRandom();producer(OutputStreamout){d1=newDataOutputStream(out);}publicvoidrun(){//System.out.println("producer");try{while(i<10){doublenum=r.nextDouble()*10;System.out.println("thenumis"+num);d1.writeDouble(num);d1.flush();i++;sleep(500);}}catch(IOExceptione){System.out.println("thisisaoutputIOExecption");e.printStackTrace();}catch(InterruptedExceptione){System.out.println("thisisainterruprException");//e.printStackTrace();}}}classconsumerextendsThread{DataInputStreamd2;intcount=0;doublesum=0;consumer(InputStreamin){d2=newDataInputStream(in);}publicvoidrun(){try{doublenum=d2.readDouble();sum+=num;count++;System.out.println("sumis"+sum);sleep(500);}catch(IOExceptione){System.out.println("thisisainputIOException");e.printStackTrace();}catch(InterruptedExceptione){e.printStackTrace();}}}publicclassPiple{publicstaticvoidmain(String[]args){try{PipedInputStreamp1=newPipedInputStream();PipedOutputStreamp2=newPipedOutputStream(p1);producerp=newproducer(p2);consumerc=newconsumer(p1);p.start();c.start();Thread.sleep(5000);p.stop();c.stop();}catch(IOExceptione){System.out.println("thisismainfunctionException1");e.printStackTrace();}catch(InterruptedExceptione){}}}
解决方案七:
同问,,,也是只能读写一次,就抛出异常了:java.io.IOException:Readenddead.
解决方案八:
importjava.io.DataInputStream;importjava.io.DataOutputStream;importjava.io.IOException;importjava.io.InputStream;importjava.io.OutputStream;importjava.io.PipedInputStream;importjava.io.PipedOutputStream;importjava.util.Random;importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;classproducerextendsThread{DataOutputStreamd1;inti=0;Randomr=newRandom();producer(OutputStreamout){d1=newDataOutputStream(out);}publicvoidrun(){try{while(!Thread.interrupted()){synchronized(d1){if(i<10){doublenum=r.nextDouble()*10;System.out.println("thenumis"+num);d1.writeDouble(num);d1.flush();i++;sleep(500);}else{Thread.yield();}}}}catch(IOExceptione){System.out.println("thisisaoutputIOExecption");e.printStackTrace();}catch(InterruptedExceptione){System.out.println("thisisainterruprException");//e.printStackTrace();}}}classconsumerextendsThread{DataInputStreamd2;intcount=0;doublesum=0;consumer(InputStreamin){d2=newDataInputStream(in);}publicvoidrun(){try{while(!Thread.interrupted()){synchronized(d2){if(d2.available()>0){doublenum=d2.readDouble();sum+=num;count++;System.out.println("sumis"+sum);sleep(500);}else{Thread.yield();}}}}catch(IOExceptione){System.out.println("thisisainputIOException");e.printStackTrace();}catch(InterruptedExceptione){System.out.println("thisisainterruprException");}}}publicclassPiple{publicstaticvoidmain(String[]args){PipedInputStreamp1=null;PipedOutputStreamp2=null;ExecutorServiceexec=Executors.newCachedThreadPool();try{p1=newPipedInputStream();p2=newPipedOutputStream(p1);producerp=newproducer(p2);consumerc=newconsumer(p1);exec.execute(p);exec.execute(c);Thread.sleep(5000);}catch(IOExceptione){System.out.println("thisismainfunctionException1");e.printStackTrace();}catch(InterruptedExceptione){System.out.println("thisismainInterruptedException1");e.printStackTrace();}finally{if(p1!=null){try{p1.close();}catch(IOExceptione){e.printStackTrace();}}if(p2!=null){try{p2.close();}catch(IOExceptione){e.printStackTrace();}}}exec.shutdownNow();}}
改了一下,跑下看看
解决方案九:
引用6楼fhw10204130的回复:
同问,,,也是只能读写一次,就抛出异常了:java.io.IOException:Readenddead.
我擦,陈年老贴,挖坟可耻
解决方案十:
引用8楼zsyhnxc的回复:
Quote: 引用6楼fhw10204130的回复:
同问,,,也是只能读写一次,就抛出异常了:java.io.IOException:Readenddead.我擦,陈年老贴,挖坟可耻
哈哈