ChessGame中的Java StopWatch

时间:2016-05-05 20:27:07

标签: java multithreading

我的ChessGame中有两个主题,我想实现时间控制:

  1. 第一个玩家的转身:second_thread.stop(),first_thread.run();
  2. counterOfSteps ++;
  3. 转为第二名玩家:first_thread.stop(),second_thread.run();

  4. counterOfSteps ++;

  5. 我已经创建了许多关于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()。我写的是例如如何实现。

2 个答案:

答案 0 :(得分:0)

  

我已经创建了许多关于Timer的信息,但我需要Threads。

没有。如果您要做的只是实现国际象棋时钟,那么您就不需要线程了。每秒(或每1/10秒)唤醒的Timer任务可以;

  • 看看轮到谁(例如counterOfSteps % 2),
  • 计算玩家使用的时间,
  • 更新GUI中的相应文本框。

要计算多少时间,它需要知道三件事情;

  • 现在几点(例如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");
            }
        }
    });
}