线程的问题

时间:2014-02-20 15:42:57

标签: java multithreading

我遇到了Java线程的问题。实际上我已经创建了一个计时器但是每当我多次单击开始按钮时程序就会快速开始计数!!

当我以初始速度第二次按下开始时,我希望我的程序从零开始。

我试图解决这个问题,但我找不到解决办法。

为什么会发生这种情况,它是JVM内部的东西吗?

这是我的代码..

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;;

public class Timer extends JFrame implements ActionListener
{
    private JPanel panel1,panel2;
    private JButton button;
    private JLabel label;
    private int second = 0;
    private int mint = 0;
    boolean flage = true;

    public Timer()
    {
        super("Timer");
        setSize(300,150);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new BorderLayout());
        setResizable(false);
        label = new JLabel();
        panel1 = new JPanel(new FlowLayout());
        panel1.add(label);

        button = new JButton("Start");
        panel2 = new JPanel(new FlowLayout());
        panel2.add(button);

        button.addActionListener(this);

        panel1.setBackground(Color.white);
        panel2.setBackground(Color.white);

        add("Center",panel1);
        add("South",panel2);

        setVisible(true);
    }

    public void paint(Graphics g)
    {
        super.paint(g);
        Font myFont = new Font("Elephant", Font.BOLD,34);
        g.setFont(myFont);
        g.setColor(Color.black);
        g.drawString(String.format("%02d",mint)+":"+String.format("%02d", second), 90, 80);
    }

    public void actionPerformed(ActionEvent e)
    {
        if(e.getSource()==button)
        {
            if(flage)
            {

            mythread a = new mythread();
            a.start();
            }
        }
    }

    class mythread extends Thread 
    {
        public void run()
        {
            for(int i=0;i<60;i++)
            {
                for(int j=0;j<60;j++)
                {
                second++;
                if(second==60)
                {
                    second=0;
                    mint++;
                }
                repaint();
                doNothing(1000);
                }
                repaint();
            }
        }

        public void doNothing(int a)
        {
            try
            {
                Thread.sleep(a);
            }
            catch(Exception e)
            {

            }
        }
    }

    public static void main(String[]args)
    {
        new Timer();
    }
}

由于

2 个答案:

答案 0 :(得分:1)

每次按下按钮都会启动一个新线程。

每个线程都在倒数相同的变量(但要小心,你不能假设由于同步问题会如何表现),所以当你开始更多的线程时,你会看到变量计数越来越快。

只需在创建线程时存储对该线程的引用,当按下该按钮时,只生成该线程(如果该线程尚不存在)。

答案 1 :(得分:0)

       when you Enter The thread You set values second=0; min=0;

    public void run()
    {
        second=0;
        mint = 0;
        for(int i=0;i<60;i++)
        {
            for(int j=0;j<60;j++)
            {
            second++;
            if(second==60)
            {
                second=0;
                mint++;
            }
            repaint();
            doNothing(1000);
            }
            repaint();
        }
    }