中断等待用户输入的线程

时间:2012-01-25 02:52:01

标签: java multithreading

    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秒后立即打印。

3 个答案:

答案 0 :(得分:1)

由于IO不可中断,您可以@Override输入线程关闭输入流

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

答案 1 :(得分:1)

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

主题1:

这将是主线程或父线程。在这个线程中,你只需要数到5,然后中断线程2.

主题2:

在此线程中,您将监视静态变量:count,然后打印它并在中断时中断线程3.

主题3:

以下是您将获得输入并将输入传递给将其添加到count的函数。中断时不做任何事。

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

答案 2 :(得分:0)

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

private AtomicInt count;

public int getCount() {
   return count;
}

让main方法打印计数:

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

这样可以避免任何中断线程的需要。