2014-02-20 134 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