我的ChessGame中有两个主题,我想实现时间控制:
转为第二名玩家:first_thread.stop(),second_thread.run();
counterOfSteps ++;
我已经创建了许多关于Timer
的信息,但我需要线程。第二个线程是相同的。
有我的第一个线程的代码,它不起作用,因为时间没有停止(System.currentTimeMillis)
first = new Thread() {
@Override
public void run() {
final long time = System.currentTimeMillis();
final long duration = 10800000; //3 hours
while (true) {
try {
Thread.sleep(100);
if (counterOfSteps % 2 == 0) {
System.out.println("Time" + ((duration - (System.currentTimeMillis() - time)) / 1000) % 60);
}
} catch (InterruptedException ex) {
LOG.log(Level.SEVERE, "Unexpected interrupt", ex);
}
}
}
};
如何解决这个问题?
更新
我不使用.stop()。我写的是例如如何实现。
答案 0 :(得分:0)
我已经创建了许多关于Timer的信息,但我需要Threads。
没有。如果您要做的只是实现国际象棋时钟,那么您就不需要线程了。每秒(或每1/10秒)唤醒的Timer
任务可以;
counterOfSteps % 2
),要计算多少时间,它需要知道三件事情;
System.currentTimeMillis()
),无法暂停系统时钟(即System.currentTimeMillis()
),但这不是问题。如果您在每个回合开始时对时钟进行采样,那么您可以将当前回合的持续时间计算为System.currentTimeMillis()
减去开始时间。
答案 1 :(得分:0)
我将这个例子用于我的测验,我有10秒的答案,这个计时器每1秒减少int t
,并设置一些JLabel
剩余的次数。你可以制作Timer的2个对象,第一个玩家的第一个对象和第二个玩家的第二个对象。当有人完成移动并启动第二个计时器时,您可以停止计时器...
int t=10
lb2=new JLabel(t);
tim=new Timer(1000,new ActionListener(){
@Override
public void actionPerformed(ActionEvent e){
if(t>0){
t--;
lb2.setText(String.valueOf(t));
}else{
tim.stop();
JOptionPane.showMessageDialog(null, "Time is up");
}
}
});
}