日期:2014-05-20  浏览次数:20700 次

JAVA关于线程的问题..JAVA计时器
一个简单的计时器:
Java code
public class Testtime extends JFrame implements ActionListener,Runnable{
    JButton btn1;
    JButton btn2;
    JLabel time;
    int minute,seconds;
    Thread begin;
    boolean flag;
    public Testtime(){
        btn1=new JButton("开始计时   ");
        btn2=new JButton("   停止计时");
        time=new JLabel(0+":"+0);
        minute=0;seconds=0;
        add(btn1);
        add(time);
        add(btn2);
        setLayout(new FlowLayout());
        setSize(400,400);
        setVisible(true);
        btn1.addActionListener(this);
        btn2.addActionListener(this);
    }
    public void actionPerformed(ActionEvent e) {
        if(e.getSource()==btn1){
            begin=new Thread(Testtime.this);
            minute=0;seconds=0;
            flag=true;
            begin.start();
        }
        else{
            flag=false;
            
        }
        
    }
    public void run(){
        while(flag){
            seconds++;
            if(seconds%60==0){
                seconds=0;
                minute++;
            }
            time.setText(minute+" : "+seconds);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        }
    public static void main(String args[]){
        new Testtime();
    }
}

点击按钮“开始计时”,“停止计时”均能正常工作。

但是如果我连续点击了两次“开始计时”,秒钟速度会快一倍。


请问该怎么修改代码呢?

------解决方案--------------------
事件处理里面,需要判断当前线程是否还是alive的,如果是则将其停止。
如下修改代码:

public void actionPerformed(ActionEvent e) {
if(e.getSource()==btn1){
if (begin != null && begin.isAlive()) { //检查线程的状态。。。
begin.stop();
}
begin = new Thread(Testtime.this);

minute=0;seconds=0;
flag=true;
begin.start();
}
else{
flag=false;
}
}