在线程和竞争条件下的java CountDownLatch

时间:2015-06-11 07:55:30

标签: java multithreading

我有一个必须从控制台应用程序读取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()。有没有办法做这件事,从不阻止程序?谢谢。

1 个答案:

答案 0 :(得分:0)

latch.await()将阻塞,直到闩锁结束,所以你应该将那条线移到最后。