2013-09-21 4 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 переменной volatile, в противном случае значение false будет кэшировать. Кроме того, нет никаких причин, чтобы сделать его Boolean - примитивный будет работать так:

private volatile boolean timeToQuit=false; 

Кроме того, необходимо изменить состояние внутреннего контура обратить внимание на timeToQuit:

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

Вы могли также добавьте звонок в interrupt, но так как ваш поток не более чем в секундах от проверки флага, это необязательно.

+1

Как насчет использования Thread.interrupt() ???? –

+0

@RahulTripathi Да, это можно сделать, но поскольку код OP проверяет флаг каждую секунду, все это может спасти вас, это подсевая задержка. – dasblinkenlight

+0

Получил это ... на самом деле я просто хотел знать, было бы правильным использовать прерывание здесь или нет .. спасибо! –

Смежные вопросы