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

时间:2015-04-21 11:10:30

标签: 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();
        }
    }

}

2 个答案:

答案 0 :(得分:1)

您无法中断正在读取输入的线程。请参阅How to stop a thread waiting in a blocking read operation in Java?

如果您只想退出JVM,您可以这样做:

System.exit(0)

答案 1 :(得分:0)

ready()上检查BufferedReader为我解决了问题:

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?