如何正确中断正在读取用户输入的 Java 线程?
How to properly interrupt a Java thread which is reading user input?
我有一个耗时的任务 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();
}
}
}
您不能中断正在读取输入的线程。参见 How to stop a thread waiting in a blocking read operation in Java?。
如果您只想退出 JVM,您可以这样做:
System.exit(0)
在 BufferedReader
上检查 ready()
解决了我的问题:
while ( ! Thread.currentThread().isInterrupted() ) {
if ( br.ready() ) {
s = br.readLine();
if ( s.equals("abort") ) {
cb.doAbort();
Thread.currentThread().interrupt();
}
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
这里有更多信息(即使我的问题真的与超时无关):
Is it possible to read from a InputStream with a timeout?
我有一个耗时的任务 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();
}
}
}
您不能中断正在读取输入的线程。参见 How to stop a thread waiting in a blocking read operation in Java?。
如果您只想退出 JVM,您可以这样做:
System.exit(0)
在 BufferedReader
上检查 ready()
解决了我的问题:
while ( ! Thread.currentThread().isInterrupted() ) {
if ( br.ready() ) {
s = br.readLine();
if ( s.equals("abort") ) {
cb.doAbort();
Thread.currentThread().interrupt();
}
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
这里有更多信息(即使我的问题真的与超时无关):
Is it possible to read from a InputStream with a timeout?