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秒后立即打印。
答案 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());
这样可以避免任何中断线程的需要。