2013-09-21 151 views
3

我做了一個倒數計時器,並且假設「停止」按鈕停止倒計時並重置文本字段。如何停止線程?

class Count implements Runnable { 
    private Boolean timeToQuit=false; 

    public void run() { 
     while(!timeToQuit) { 
      int h = Integer.parseInt(tHrs.getText()); 
      int m = Integer.parseInt(tMins.getText()); 
      int s = Integer.parseInt(tSec.getText()); 
      while(s>=0) { 
       try { 
        Thread.sleep(1000); 
       } 
       catch(InterruptedException ie){} 
       if(s == 0) { 
        m--; 
        s=60; 
        if(m == -1) { 
         h--; 
         m=59; 
         tHrs.setText(Integer.toString(h)); 
        } 
        tMins.setText(Integer.toString(m)); 
       } 
       s--; 
       tSec.setText(Integer.toString(s)); 
      } 
     } 
     tHrs.setText("0"); 
     tMins.setText("0"); 
     tSec.setText("0"); 
    } 

    public void stopRunning() { 
     timeToQuit = true; 
    } 
} 

,我叫stopRunning()按下「停止」按鈕時。它不會工作。

另外,我打電話給stopRunning()嗎?

public void actionPerformed(ActionEvent ae) 
{ 
    Count cnt = new Count(); 
    Thread t1 = new Thread(cnt); 
    Object source = ae.getSource(); 
    if (source == bStart) 
    { 
     t1.start(); 
    } 
    else if (source == bStop) 
    { 
     cnt.stopRunning(); 
    } 
} 

回答

5

你需要讓你的timeToQuit變量volatilefalse否則價值會被緩存。此外,沒有理由讓它Boolean - 原始將工作以及:

private volatile boolean timeToQuit=false; 

您還需要內環要注意的條件更改爲timeToQuit

while(s>=0 && !timeToQuit) { 
    ... 
} 

你可以還要加上interrupt的電話,但由於您的線程永遠不會超過檢查該標誌的秒數,所以這不是必需的。

+1

如何使用Thread.interrupt()? –

+0

@RahulTripathi是的,人們可以這樣做,但由於OP的代碼每秒都會檢查一次標誌,所有這些都可以爲您節省時間。 – dasblinkenlight

+0

得到了......實際上我只是想知道在這裏使用中斷是否合適..謝謝! –