当前位置: 首页 > 知识库问答 >
问题:

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

晋骏喆
2023-03-14

我有一个耗时的任务compute(),我想在用户输入“abort”时手动中止它。

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

}

共有1个答案

裴令秋
2023-03-14

您不能中断正在读取输入的线程。请参阅如何在Java中停止在阻塞读操作中等待的线程?。

如果您只想退出JVM,您可以执行以下操作:

System.exit(0)
 类似资料:
  • 我发现其他人也有同样的问题,他们的问题通过在InputStreamReader构造函数中指定UTF-8来解决: 以UTF-8形式读取InputStream 这对我不起作用,我也不知道为什么。无论我尝试什么,我总是得到转义的unicode值(斜杠-U+十六进制),而不是实际的语言字符。我在这里做错了什么?提前道谢! 请注意:这不是字体问题。我之所以知道这一点,是因为如果我对同一个文件使用Resour

  • 问题内容: 我有用于在Java中创建线程的此类 控制台显示以下文本作为输出 我的代码创建了新线程: 我的问题是:为什么返回正确的线程名却返回另一个? 问题答案: 为什么要返回正确的线程名称而又返回其他? 您的课程,但随后您通过调用以下内容开始: 这是不正确的。这意味着创建的线程实际是 不 一样的。 应该实现而 不是 扩展线程。您的代码可以工作,因为线程也是可运行的。 因为有两个线程对象,所以当您调

  • 问题内容: 我现在使用的代码: 似乎工作正常,但我不确定在将ByteBuffer返回池之前是否需要ByteBuffer。我什至不确定要使用。文档中没有太多关于它的内容。 问题答案: 读取请求正文的一种更简单的方法是将其分派到一个工作线程,该工作线程可以使用。 有两种方法:使用或文档中所示的调度模式。这是使用的示例: 在基本上没有派遣你。

  • 这是一个可以用作重复目标的规范问题/答案。这些需求基于每天发布的最常见的问题,并可能根据需要添加到。它们都需要相同的基本代码结构来到达每个场景,并且它们通常相互依赖。 大多数问题都包括在以上一个操作中失败的尝试。 > 我希望能够让我的程序自动等待下一个输入后,每个先前的输入以及。 我想知道如何检测一个退出命令,并结束我的程序时,该命令输入。 在Java世界中,是一个特例,它是一门极其挑剔的课,老师

  • 尝试在多线程环境中的条件帐户之间进行转移,我的方法有多真实,我错在哪里? 按照计划,我在主线程中创建了一个新的线程,在这个新线程中初始化了一个类型为Transfer的新类,然后我从数据库中获取了2个帐户的数据,我随机确定了要随机传输的数量。我翻译并将更改写回数据库。账户中所有资金的总和必须保持正确。也就是说,如果我们有50个账户,每个账户1000元(总共50000元),那么在所有交易之后,应该不会

  • 但这一个也不起作用。正确的答案是加入线程并删除2个睡眠: 我的问题是:为什么我的答案都不能被接受?我的实验室领导问,但他不能给我一个答案。在家里编写了测试代码,它似乎工作得很好。提前感谢您的帮助!