2014-02-20 136 views
0

我有一个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(); 
    } 
} 

感谢

+0

我只是使用使用Thread.stop(); make second = 0;并再次做Thread.start(),现在它工作正常 – as77c

回答

1

你开始每次按下按钮时,一个新的线程。

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

只是存储在线程的引用,当你创建它,当他们按下按钮,只有当它不存在产卵线程。

+0

哦,我看到了,但我怎么能解决这个问题,我想刷新旧线程,并创建一个新的..谢谢你的帮助:) – as77c

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

它工作正常,但当我第二次按开始按钮时,计数器开始加速越来越多.. – as77c