【发布时间】:2015-06-28 12:20:29
【问题描述】:
我有一个耗时的任务compute(),我想在用户输入“abort”时手动中止。
为此,我有一个 Runnable InputAbort 使用无限循环和一个 BufferedReader 来扫描用户输入。当用户决定不中止长时间的计算时,就会出现问题。在这种情况下,运行InputAbort 的线程不会被正确中断,从而阻止 JVM 完成(使线程成为守护进程确实可以工作,但我认为必须有一种方法可以正确结束线程)。
当用户输入“abort”中止计算时,问题不会发生。当我删除 Runnable 中的 s = br.readLine(); 行并且用户等待计算完成时,它也不会发生。
启动线程和计算:
ComputationObject co = new ComputationObject();
Runnable rInputAbort = new InputAbort(co);
Thread tInputAbort = new Thread(rInputAbort);
tInputAbort.start();
co.compute();
tInputAbort.interrupt();
可运行:
public class InputAbort implements Runnable {
private ComputationObject co;
public RunnableInputAbort(ComputationObject co) {
this.co = co;
}
@Override
public void run() {
try {
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
String s = "";
while ( ! Thread.currentThread().isInterrupted() ) {
s = br.readLine();
if ( s.equals("abort") ) {
co.abort();
Thread.currentThread().interrupt();
}
}
br.close();
isr.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
【问题讨论】:
-
这个问题不是简单地询问如何使线程超时;读取输入的线程也必须响应中断信号,即使它在读取时被阻塞。
-
我知道这不能回答问题,但用户通过命令行停止进程是否必要?过去,我使用文件的存在作为用户与进程通信的一种方式。我知道不理想,但这将是一个解决方案。用户发出“touch stop.stop”以在预期的位置创建一个文件,然后进程终止,因为它已经看到该文件在那里。
标签: java multithreading bufferedreader