1

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

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

  4. 计算获胜者并做一些事情
  5. 转到 1。

我在考虑使用计时器和计时器任务来跟踪时间,也许使用一个在 10 秒后从“打开”变为“关闭”的布尔变量?请给我一些建议。

4

3 回答 3

2

而不是使用Timerand TimerTask,我会将您的想法更新为使用Executors的更当前的方式。使用 aScheduledExecutor您可以安排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();
    }
}
于 2010-04-30T16:23:00.250 回答
0

没错,使用计时器可以更改该值:

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

就是这样。里面的方法run会在你调用10秒后执行schedule

编辑

样本:

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!!");
    }
}
于 2010-04-30T16:20:16.290 回答
0

是的,您需要一个计时器,并且某种“打开/关闭”标志将是可行的方法。

确保将您的标志设置为“易失性”,以便所有读取您输入的线程立即看到更改。

想一想,您甚至可能会想到让计时器任务通过中断来访问每个读取器线程,因此它们都立即被告知,而不是每当它们弹出检查时。

于 2010-04-30T16:21:48.997 回答