【问题标题】:Handling multiple threads reading input处理多个线程读取输入
【发布时间】:2013-12-12 19:49:38
【问题描述】:

我正在开发一个应用程序(控制台),其中包含一个我希望允许用户暂停和恢复的 while 循环。经过一些研究,似乎一个额外的线程负责等待用户输入是正确的解决方案。

我已经能够实现持续等待输入的附加线程,并且还有一个 kill 方法,它设置标志变量以停止线程 while() 循环。不幸的是,由于除非有输入,否则 while 循环不会结束,因此只有在输入线程的 while 循环至少完成一次后,此终止标志才会生效。由于主线程在自己的循环结束时也期望输入,因此用户的输入由输入线程获取,导致主线程的 Scanner 错过输入,除非输入两次。有什么方法可以立即终止输入线程的 while() 循环,而无需完成一次迭代?是否需要某种超时功能?我已经在下面发布了相关代码:

新线程的 InputReader 可运行代码:

public class ReadInput implements Runnable
{
    private static volatile boolean running = true;
    Scanner user_input = new Scanner(System.in);

    public void run()
    {
        while(running)
        {
            System.out.println("ReadingInput Input Value: " + user_input.nextLine());
        }
    }

    public void kill()
    {
        running = false;
        System.out.println("Thread Killed.");
    }
}

主线程代码:

//Start reader thread in order to scan for input without stopping main code
ReadInput reader = new ReadInput();
Thread reader_thread = new Thread(reader);
reader_thread.start();

while(code_available_for_processing)
{
    //Main Thread while() loop processing
}

//STOP Input Reader Thread before main thread requests input
reader.kill();

//Request user input for program re-run

【问题讨论】:

  • 首先 - 你需要在应用程序终止之前杀死它吗?如果你这样做,你可以尝试关闭标准输入?没试过,不知道会怎样。也许它会抛出线程,或者只是在没有输入的情况下返回 - 其中任何一个都可以,并允许您检查运行标志。可能值得一试:)
  • 需要从标准输入stackoverflow.com/questions/2249680/…非阻塞读取

标签: java multithreading


【解决方案1】:

使用Thread 类的中断功能。这可能导致被阻塞等待输入的线程抛出InterruptedIOException。请参阅elsewhere 了解更多信息。

【讨论】:

  • 我已经通过在主线程中调用 reader_thread.interrupt() 进行了尝试,然后在 ReadInput 线程中添加了一个 InterruptedException 捕获。问题是它似乎仍然处于阻塞模式,等待输入。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-08
  • 1970-01-01
  • 1970-01-01
  • 2012-11-27
  • 2015-07-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多