【问题标题】:Interrupting an Input Process With a Timer使用计时器中断输入过程
【发布时间】:2014-03-06 04:34:43
【问题描述】:

我使用 Java 制作了一个计时器,它在十五秒后显示“时间到了”消息。在此期间,用户将输入要复制的消息。但在那段时间结束后,我希望键盘输入停止。代码如下:

主类

import java.util.Scanner;

public class TypingTest
{
    public static void main(String[] args)
    {
        boolean a;
        String message, enter;

        Watch watch = new Watch();
        Scanner input = new Scanner(System.in);
        System.out.println("After you press <enter>, you will have fifteen seconds to copy the message.");
        System.out.println("Once you are finished, do not press any other button until prompted to.");
        enter = input.nextLine();
        a = watch.timer(15,"Time's up! Press <enter> to see how you did."); // message appears after 15 seconds
        if (a == true)
            message = input.nextLine();    // While timer is running
        else
            message = null;    // After timer is done running
    }
}

Watch 类中的定时器方法

import java.util.Timer;
import java.util.TimerTask;

class Watch
{
    private boolean running;

    public Watch()
    {
        running = false;
    }

    public static boolean timer(long delay, final String message)
    {
        running = true;
        delay *= 1000;    // Convert from milliseconds to seconds
        final Timer timer = new Timer();
        timer.schedule(new TimerTask()
        {
            public void run()
            {
                System.out.println(message);    // message output after 'delay' seconds
                timer.cancel();
                running = false;
            }
        }
        ,delay);    // delay in seconds
        return running;
    }
}

任何建议将不胜感激。

【问题讨论】:

    标签: java multithreading timer


    【解决方案1】:
    1. Watch.timer() 方法应该是非静态的,并且在调用 watch.timer(..) 之后应该有一个循环来检查 watch.running 标志以中断输入线程的读取。
    2. 输入的读取,应该在一个线程中并且需要处于非阻塞模式,这意味着您需要检查一个标志以查看它是否应该继续读取输入数据并使用 InputStream.available () 方法来查看是否有数据要读取,并且只使用 .read() 方法读取所有可用数据,不要使用 readLine() 它将阻塞。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      • 2021-06-05
      相关资源
      最近更新 更多