我有一个必须从控制台应用程序读取stdin和stdout的线程。这个线程必须不断读取,直到java程序结束(java程序启动控制台应用程序并与他一起读写)。
现在我有了这个问题:从控制台应用程序读取时,如果读取确定的事情必须设置运行异常的标志变量。我解决了把一个锁存CountDown。但是当线程没有读到这个东西时,屏障latch.await()
会锁定java程序的连续性,我不知道如何解决这个问题。
这是代码的一部分:
p = Runtime.getRuntime().exec("testpad -i -c"+can+" -n"+pad+" "+pathFile);
final InputStream inStream = p.getInputStream();
Thread uiThread = new Thread("UIHandler") {
@Override
public void run() {
InputStreamReader reader = new InputStreamReader(inStream);
Scanner scan = new Scanner(reader);
String prec=null;
while (scan.hasNextLine()) {
prec=scan.nextLine();
System.out.println(prec);
if(err.equals(prec)){
flag[0] = 1;
latch.countDown();
}
}
}
};
uiThread.start();
latch.await();
if(flag[0]!=1){
this.dispose();
new menu().setVisible(true);
}
else{
Exception e = new Exception("Error!");
Component f = null;
JOptionPane.showMessageDialog(f, err, e.getMessage(), JOptionPane.WARNING_MESSAGE);
this.dispose();
new inizio().setVisible(true);
}
在线程的if
中有一个设置标志变量的部分。但是如果线程没有进入那里,那么java程序会阻止barriel latch.await()
。有没有办法做这件事,从不阻止程序?谢谢。
答案 0 :(得分:0)
latch.await()
将阻塞,直到闩锁结束,所以你应该将那条线移到最后。