我试图做一个简单的游戏,我不断需要玩家的输入。这需要仅在特定时间段内发生。之后发送的所有内容都将被丢弃。在一段时间后,新游戏开始。所以:
10秒不再输入
我在考虑使用计时器和timertask来跟踪时间,并且可能使用在10秒后从“打开”变为“关闭”的布尔变量?请给我一些建议。
答案 0 :(得分:2)
我不会使用Timer
和TimerTask
,而是将您的想法更新为使用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
修改强>
样品:
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”,以便读取输入的所有线程立即看到更改。
想想看,你甚至可能会想到让计时器任务用一个中断击中每个读者线程,所以他们都会被告知,而不是每当他们弹出来检查时。