2012-01-25 29 views
1
public class InterruptedInput { 

    public static void main(String[] args) { 
     InputThread th=new InputThread(); //worker thread instantiated. 
     th.start(); //worker thread start. 
     try{ 
      Thread.sleep(5000); //main thread sleep for 5 sec. 
     }catch(InterruptedException ex){} 
     th.interrupt(); //worker thread interrupted. 
    } 
} 

class InputThread extends Thread{ 
    int sum; 
    BufferedReader br; 
    public void run(){ 
     br=new BufferedReader(new InputStreamReader(System.in)); 
     try{ 
      sum(); 
      sleep(10000); //worker thread sleep for 10 sec. 
     }catch(Exception ex){ 
      System.out.println("sum="+sum); 
     } 
    } 

    public void sum(){ 
     try{ 
      while(!isInterrupted()){ 
       sum+=Integer.parseInt(br.readLine()); 
      } 
     }catch(Exception ex){} 
    } 
} 

在这个程序中,工作线程等待由用户(这将是一个整数值),输入和总结,直到主线程interrut()它。
但是当主线程interrupt()worker thread其对I/O的用户输入和不中断。中断一个线程等待用户输入

我想要这个程序的输出是:
当程序执行时,用户必须输入整数值,并在5秒后。输入值的总和将被打印,或者用户仍然输入值或等待5秒后消失。结果将在第5秒后立即打印。

+1

我相信你的问题是br.readLine()将在循环的布尔值被重新评估之前执行。这意味着你必须在循环过期后输入1个数字 – jozefg

+0

@jozefg:你说得对。你有任何解决方案? –

回答

1

好,所以这个代码的问题是在检查循环条件之前必须执行语句br.readLine()。所以为了避免这种情况,我可能会有3个线程。

主题1:

这将是主线或父线程。在这个主题,你会仅仅数到5,然后中断线程2

线程2:

在这个线程要监视静态变量:count,然后打印和中断时中断线程3。

主题3:

这里是你会得到输入和输入传递到这将它添加到count功能。中断时什么也不做。

如果您有任何问题,请告诉我。

1

由于IO是非可中断可以@Override的InputThread关闭输入流

@Override 
public void interrupt(){ 
    try{ 
     this.br.close(); 
    }finally{ 
     super.interrupt(); 
    } 
} 
+0

输出不像它应该的那样。请检查上面的代码。 –

+0

你不应该在sum()方法中捕获并吞下IOException。删除该try/catch并用方法声明传播Exception inline。 –

+0

@John Vint:我在我的(现在已删除的)答案中遵循了同样的直觉,即从主线程异步关闭BufferedReader并导致IOException,但由于某种原因,它似乎无法工作。 br.close()的调用会无限期地阻塞。 – Tudor

0

另一种方法是,以允许在任何时间将被打印的计数。添加以下到InputThread类:

private AtomicInt count; 

public int getCount() { 
    return count; 
} 

而且具有的主要方法打印计数:

System.out.println("Sum:" + th.getCount()); 

这将避免任何需要interupting线程。

+0

对不起!但我需要它使用'interrupt()' –