Java 管道流和倒计时闩锁
我正在尝试原型化一个程序,该程序将读取一个流,然后在线程池中旋转新的处理流,因为主线程在流中走得更远。我遇到了管道流和倒计时闩锁的问题 当我在主线程中注释掉“latch.await()”并运行以下代码时,我得到一个“Write end dead”错误。当我在未注释“latch.await()”的情况下运行时,程序挂起,niether线程退出 任何关于我做错了什么的想法,或者关于如何更好地使用多个处理流处理单个流的建议。ThxJava 管道流和倒计时闩锁,java,concurrency,inputstream,countdownlatch,Java,Concurrency,Inputstream,Countdownlatch,我正在尝试原型化一个程序,该程序将读取一个流,然后在线程池中旋转新的处理流,因为主线程在流中走得更远。我遇到了管道流和倒计时闩锁的问题 当我在主线程中注释掉“latch.await()”并运行以下代码时,我得到一个“Write end dead”错误。当我在未注释“latch.await()”的情况下运行时,程序挂起,niether线程退出 任何关于我做错了什么的想法,或者关于如何更好地使用多个处理流处理单个流的建议。Thx import java.io.BufferedInputStream;
import java.io.BufferedInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import java.util.concurrent.CountDownLatch;
//import java.util.Arrays;
public class RunTestPipePool {
final static int BUFFER_SIZE = 8;
static class PipeWriter extends Thread implements Runnable {
InputStream in;
OutputStream out;
CountDownLatch latch;
public PipeWriter(InputStream in, OutputStream out, CountDownLatch latch) {
this.in = in;
this.out = out;
this.latch = latch;
}
public void run() {
try {
byte[] buffer = new byte[BUFFER_SIZE];
int n = 0;
while ((n = in.read(buffer)) >= 0) {
// System.out.println("PipeWriter Processing: " + new String(Arrays.copyOfRange(buffer,0,n)));
out.write(buffer,0,n);
}
latch.countDown();
out.close();
} catch (Exception ex) {
ex.printStackTrace();
} finally {
System.out.println("PipeWriter Terminating");
}
}
}
public static void main(String[] args) throws Exception {
CountDownLatch latch = new CountDownLatch(1);
PipedInputStream writeIn = new PipedInputStream();
PipedOutputStream readOut = new PipedOutputStream(writeIn);
InputStream reader = new BufferedInputStream(System.in);
PipeWriter writer = new PipeWriter(writeIn,System.out,latch);
writer.start();
byte[] buffer = new byte[BUFFER_SIZE];
int n = 0;
while ((n = reader.read(buffer)) >= 0) {
// System.out.println("RunTestPipePool Processing: " + new String(Arrays.copyOfRange(buffer,0,n)));
readOut.write(buffer,0,n);
}
latch.await();
reader.close();
System.out.println("RunTestPipePool Terminating");
}
}
已注释掉latch.await()的输出:
C:\Users\matty\Documents\workspace\test_pipe\bin>echo hello world | java -jar Ru
nTestPipePool.jar
RunTestPipePool Terminating
hello world
java.io.IOException: Write end dead
at java.io.PipedInputStream.read(PipedInputStream.java:294)
at java.io.PipedInputStream.read(PipedInputStream.java:361)
at java.io.InputStream.read(InputStream.java:82)
at RunTestPipePool$PipeWriter.run(RunTestPipePool.java:28)
PipeWriter Terminating
未注释latch.await()的输出:
C:\Users\matty\Documents\workspace\test_pipe\bin>echo hello world | java -jar Ru
nTestPipePool.jar
hello world
C:\Users\matty\Documents\workspace\test_pipe\bin>
修改代码:
import java.io.BufferedInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import java.util.concurrent.CountDownLatch;
//import java.util.Arrays;
public class RunTestPipeStack {
final static int BUFFER_SIZE = 8;
static class PipeWriter extends Thread implements Runnable {
InputStream in;
OutputStream out;
CountDownLatch latch;
public PipeWriter(InputStream in, OutputStream out, CountDownLatch latch) {
this.in = in;
this.out = out;
this.latch = latch;
}
public void run() {
try {
byte[] buffer = new byte[BUFFER_SIZE];
int n = 0;
while (in.available() != 0 && (n = in.read(buffer)) >= 0) {
// System.out.println("PipeWriter Processing: " + new String(Arrays.copyOfRange(buffer,0,n)));
out.write(buffer,0,n);
}
System.out.println("PipeWriter Terminating");
in.close();
out.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
public static void main(String[] args) throws Exception {
CountDownLatch latch = new CountDownLatch(1);
PipedInputStream writeIn = new PipedInputStream();
PipedOutputStream readOut = new PipedOutputStream(writeIn);
InputStream reader = new BufferedInputStream(System.in);
PipeWriter writer = new PipeWriter(writeIn,System.out,latch);
writer.start();
byte[] buffer = new byte[BUFFER_SIZE];
int n = 0;
while ((n = reader.read(buffer)) >= 0) {
// System.out.println("RunTestPipePool Processing: " + new String(Arrays.copyOfRange(buffer,0,n)));
readOut.write(buffer,0,n);
}
reader.close();
System.out.println("RunTestPipePool Terminating");
}
}
修改输出:
C:\Users\matty\Documents\workspace\test_pipe\bin>echo hello world | java -jar Ru
nTestPipeStack.jar
RunTestPipePool Terminating
hello world
PipeWriter Terminating
C:\Users\matty\Documents\workspace\test_pipe\bin>
wait()的用法是正确的,但它不起作用的原因是线程处于阻塞状态,in.read()正在等待下一组字节。但是在“你好,世界”之后,什么都没有了。
完成读取后,检查是否有更多可用字节。如果它们没有关闭,则关闭流并打破循环。此外,您可能还需要添加=空签入while循环
while (in!=null && (n = in.read(buffer)) >= 0) {
System.out.println("PipeWriter Processing: " + new
String(Arrays.copyOfRange(buffer,0,n)));
out.write(buffer,0,n);
if(in.available()==0)
{
latch.countDown();
out.close();
in.close();
break;
}
}
System.out.println("Completed the PipeWriter loop");
希望这有帮助 wait()的用法是正确的,但它不工作的原因是线程处于阻塞状态,in.read()正在等待下一组字节。但是在“你好,世界”之后,什么都没有了。
完成读取后,检查是否有更多可用字节。如果它们没有关闭,则关闭流并打破循环。此外,您可能还需要添加=空签入while循环
while (in!=null && (n = in.read(buffer)) >= 0) {
System.out.println("PipeWriter Processing: " + new
String(Arrays.copyOfRange(buffer,0,n)));
out.write(buffer,0,n);
if(in.available()==0)
{
latch.countDown();
out.close();
in.close();
break;
}
}
System.out.println("Completed the PipeWriter loop");
希望这有帮助 你认为我下面的答案有帮助吗?事实证明,in.available()可以在没有CountDownLatchwhile(in.available()!=0&&(n=in.read(buffer))>=0{…process…}的情况下工作,而in.available()可以在没有CountDownLatchwhile(in.available()!=0&(n=in.read(buffer))>=0{…process…}的情况下工作这就是诀窍。