JAVA:我如何仅在一段时间内接受输入

时间:2010-04-30 16:15:35

标签: java networking input timer wait

我试图做一个简单的游戏,我不断需要玩家的输入。这需要仅在特定时间段内发生。之后发送的所有内容都将被丢弃。在一段时间后,新游戏开始。所以:

  1. 开始游戏
  2. 等待10秒内所有玩家的输入
  3.   

    10秒不再输入

  4. 计算胜利者并做一些事情
  5. 转到1。
  6. 我在考虑使用计时器和timertask来跟踪时间,并且可能使用在10秒后从“打开”变为“关闭”的布尔变量?请给我一些建议。

3 个答案:

答案 0 :(得分:2)

我不会使用TimerTimerTask,而是将您的想法更新为使用Executors的更新方式。使用ScheduledExecutor,您可以安排Runnable之类的:

// class member or perhaps method var
private boolean acceptInput = true;

// elsewhere in code
ScheduledExecutor executor = new ScheduledExecutor(1);
startGame();
mainLoop();
executor.schedule(flipInput, 10, TimeUnit.SECONDS);

// inner class
private class FlipInput implements Runnable {
    public void run() {
        acceptInput = !acceptInput;
        calculateWinner();
        doSomeStuff();
        startGame();
        executor.schedule(flipInput, 10, TimeUnit.SECONDS);
        mainLoop();
    }
}

答案 1 :(得分:0)

你是对的,有了计时器,你可以改变这个值:

 Timer timer = new Timer();
 timer.schedule( new TimerTask(){
       public void run() {
            synchronized( lock ) { 
                isOpen = false;
            }
        }
   }, 10000 );

就是这样。 run内的方法将在您致电schedule

后10秒执行

修改

样品:

import java.util.Timer;
import java.util.TimerTask;
import java.util.Date;
import static java.lang.System.out;

public class Test {
    public static void main( String [] args ) {
        Timer timer = new Timer();
        timer.schedule( new TimerTask(){
            public void run() {
                out.println(new Date()+" No more bets, thank you!");
            }
        }, 10000 );
        out.println(new Date() + " Place your bets, place your bets!!");
    }
}

答案 2 :(得分:0)

是的,你需要一个计时器,某种“打开/关闭”标志将是你要走的路。

请务必将您的标记设置为“volatile”,以便读取输入的所有线程立即看到更改。

想想看,你甚至可能会想到让计时器任务用一个中断击中每个读者线程,所以他们都会被告知,而不是每当他们弹出来检查时。