java - 如何正确中断正在读取用户输入的 Java 线程?

标签 java multithreading bufferedreader

我有一个耗时的任务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)

关于java - 如何正确中断正在读取用户输入的 Java 线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29770514/

相关文章:

java - 有没有办法从 .java 文件获取 .class 文件

java - 如何使用 java 单击按钮停止 selenium 服务器?

java - 如何在 DecimalFormat 中使用空格作为分组分隔符?

java - Servlet在tomcat上同时处理多个请求

java bufferedReader.readLine() 无法读取整个文件行

java - org.obolibrary.oboformat.parser.OBOFormatParser警告警告: LINE: 901 Expected white space at pos: 6 LINE: </rdf:RDF>

android - 在 Activity 之间传递类的实例

multithreading - F# 并行设计模式

java - 扫描仪不会读取文件中的下一行。 java

java - 读取文件时行为空但行不为空