我试图做一个简单的游戏,我不断需要玩家的输入。这只需要在特定时间段内发生。之后发送的所有内容都将被丢弃。在该时间段之后开始新的游戏。所以:
- 开始游戏
- 在 10 秒内等待所有玩家的输入
10 秒不再输入
- 计算获胜者并做一些事情
- 转到 1。
我在考虑使用计时器和计时器任务来跟踪时间,也许使用一个在 10 秒后从“打开”变为“关闭”的布尔变量?请给我一些建议。
我试图做一个简单的游戏,我不断需要玩家的输入。这只需要在特定时间段内发生。之后发送的所有内容都将被丢弃。在该时间段之后开始新的游戏。所以:
10 秒不再输入
我在考虑使用计时器和计时器任务来跟踪时间,也许使用一个在 10 秒后从“打开”变为“关闭”的布尔变量?请给我一些建议。
而不是使用Timer
and 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();
}
}
没错,使用计时器可以更改该值:
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!!");
}
}
是的,您需要一个计时器,并且某种“打开/关闭”标志将是可行的方法。
确保将您的标志设置为“易失性”,以便所有读取您输入的线程立即看到更改。
想一想,您甚至可能会想到让计时器任务通过中断来访问每个读取器线程,因此它们都立即被告知,而不是每当它们弹出检查时。