Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 线程的问题_Java_Multithreading - Fatal编程技术网

Java 线程的问题

Java 线程的问题,java,multithreading,Java,Multithreading,我对Java线程有一个问题。实际上,我已经创建了一个计时器,但每当我多次单击“开始”按钮时,程序开始快速计数 当我以初始速度第二次按start时,我希望我的程序从零开始 我试图解决这个问题,但找不到解决办法 为什么会发生这种情况,它是JVM内部的东西吗 这是我的密码 import javax.swing.*; import java.awt.*; import java.awt.event.*;; public class Timer extends JFrame implements Act

我对Java线程有一个问题。实际上,我已经创建了一个计时器,但每当我多次单击“开始”按钮时,程序开始快速计数

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

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

为什么会发生这种情况,它是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();
    }
}
import javax.swing.*;
导入java.awt.*;
导入java.awt.event.*;;
公共类计时器扩展JFrame实现ActionListener
{
私人JPanel小组1、小组2;
私人按钮;
私人标签;
私有整数秒=0;
私有int mint=0;
布尔鞭毛=真;
公共计时器()
{
超级(“定时器”);
设置大小(300150);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(新的BorderLayout());
可设置大小(假);
label=新的JLabel();
panel1=新的JPanel(新的FlowLayout());
面板1.添加(标签);
按钮=新按钮(“开始”);
panel2=新的JPanel(新的FlowLayout());
面板2.添加(按钮);
addActionListener(这个);
镶板1.立根背景(颜色:白色);
镶板2.立根背景(颜色:白色);
添加(“中心”,第1栏);
添加(“南”,第2组);
setVisible(真);
}
公共空间涂料(图g)
{
超级油漆(g);
Font myFont=新字体(“大象”,字体粗体,34);
g、 setFont(myFont);
g、 设置颜色(颜色为黑色);
g、 drawString(String.format(“%02d”,mint)+:“+String.format(“%02d”,second)),90,80);
}
已执行的公共无效操作(操作事件e)
{
如果(例如getSource()==按钮)
{
如果(鞭毛)
{
mythread a=新的mythread();
a、 start();
}
}
}
类mythread扩展线程
{
公开募捐
{

对于(inti=0;i,每次按下按钮时,您都会启动一个新线程

每个线程都在倒计时相同的变量(但请注意,您不能假设由于同步问题,该变量将如何运行),因此当您启动更多线程时,变量计数会越来越快

创建线程时只需存储对该线程的引用,当他们按下按钮时,仅当该线程不存在时才会生成该线程。

当您输入线程时,设置值second=0;min=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();
        }
    }
公开募捐 { 秒=0; 薄荷=0;
对于(inti=0;我明白了,但是我怎么解决这个问题呢?我想刷新旧线程并创建一个新线程。感谢您的帮助:)它工作得很好,但是当我第二次按开始按钮时,计数器开始越来越快。我只使用thread.stop();make second=0;然后再次执行thread.start(),现在它工作得很好