Java 如何启动一个线程,但使其在特定时间内保持活动状态?

Java 如何启动一个线程,但使其在特定时间内保持活动状态?,java,multithreading,java.util.scanner,Java,Multithreading,Java.util.scanner,我真的不想启动线程,然后将其置于睡眠状态,例如: Thread.start(); Thread.sleep(3000); //*Example* 相反,我想这样做(我为这个业余的例子道歉): 我这样做是因为我正在制作一个程序/迷你游戏,在一定时间内对用户输入进行计时。基本上,用户有5秒钟的时间输入某个字符/数字/字母,然后,输入流被切断。有点像: Scanner kb = new Scanner(System.in); int num = kb.nextInt(); kb.close()

我真的不想启动线程,然后将其置于睡眠状态,例如:

Thread.start();
Thread.sleep(3000);  //*Example* 
相反,我想这样做(我为这个业余的例子道歉):

我这样做是因为我正在制作一个程序/迷你游戏,在一定时间内对用户输入进行计时。基本上,用户有5秒钟的时间输入某个字符/数字/字母,然后,输入流被切断。有点像:

Scanner kb = new Scanner(System.in);
int num = kb.nextInt();
kb.close()    //*Closes kb and input stream in turn*

我建议你使用和。如果用户在延迟到期之前完成任何任务,则可以取消该操作。如果延迟结束,则用户无法完成任何任务。

您可以尝试此示例

    final List<Integer> result = new ArrayList<>();
    Thread thread = new Thread() {
        volatile boolean isDone = false;
        Timer timer = new Timer();

        @Override
        public void run() {
            timer.schedule(new TimerTask() {
                @Override
                public void run() {
                    isDone = true;
                }
            }, 5000);

            Scanner kb = new Scanner(System.in);
            while (!isDone) {
                int num = 0;
                num = kb.nextInt();
                result.add(num);
            }
            kb.close();
        }

    };
    thread.start();
    thread.join();

    for (Integer i : result) {
        System.out.print(i + " ");
    }
final List result=new ArrayList();
线程线程=新线程(){
易变布尔isDone=false;
定时器=新定时器();
@凌驾
公开募捐{
timer.schedule(新TimerTask(){
@凌驾
公开募捐{
isDone=true;
}
}, 5000);
扫描仪kb=新扫描仪(System.in);
而(!isDone){
int num=0;
num=kb.nextInt();
结果。添加(num);
}
kb.close();
}
};
thread.start();
thread.join();
for(整数i:结果){
系统输出打印(i+“”);
}

使用<代码>用于线程调度任务以供将来在后台线程中执行的工具。任务可以安排为一次性执行,也可以定期重复执行。您的想法是错误的。任务恰好由线程完成是不相关的。你的问题是“如果一项任务花费的时间太长,我怎么能超时?”。你不会从内部接触到一个线程,让它去做它应该做的事情,你要编码它去做它首先应该做的事情。
    final List<Integer> result = new ArrayList<>();
    Thread thread = new Thread() {
        volatile boolean isDone = false;
        Timer timer = new Timer();

        @Override
        public void run() {
            timer.schedule(new TimerTask() {
                @Override
                public void run() {
                    isDone = true;
                }
            }, 5000);

            Scanner kb = new Scanner(System.in);
            while (!isDone) {
                int num = 0;
                num = kb.nextInt();
                result.add(num);
            }
            kb.close();
        }

    };
    thread.start();
    thread.join();

    for (Integer i : result) {
        System.out.print(i + " ");
    }