java - 线程的问题

标签 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();
    }
}

谢谢

最佳答案

每次他们按下按钮时,您都会启动一个新线程。

每个线程都对同一个变量进行倒计时(但要小心,由于同步问题,您无法假设其行为方式),因此当您启动更多线程时,您会看到变量计数越来越快。

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

关于java - 线程的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21912629/

相关文章:

java - Lock.java 和 LockSupport.java : what purpose we have LockSupport?

java - 为什么压缩的 Oops 为 Object Header 提供 12 个字节

java - 两个冒泡排序循环之间的实际区别

c# - 如何使用新的任务并行库确保两个任务在不同的线程甚至不同的处理器上运行?

java 两个线程操作同一个数组

python - 更改其他 Python 文件循环中的变量

java - 使用IPC组合多种语言

JavaFX BorderPane多FXML空间排列及过渡效果

java - 将字符串转换为浮点会产生意外的返回。 java

c - 什么时候可以将原子读取-修改-写入操作分解为组成宽松的操作+屏障?