Java 我怎样才能停止一根线?

Java 我怎样才能停止一根线?,java,multithreading,countdown,Java,Multithreading,Countdown,我制作了一个倒计时计时器,一个“停止”按钮用来停止倒计时并重置文本字段 class Count implements Runnable { private Boolean timeToQuit=false; public void run() { while(!timeToQuit) { int h = Integer.parseInt(tHrs.getText()); int m = Integer.parseI

我制作了一个倒计时计时器,一个“停止”按钮用来停止倒计时并重置文本字段

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()
right

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();
    }
}

您需要将
timeToQuit
变量
volatile
,否则
false
的值将被缓存。此外,没有理由将其设置为布尔值-原语也可以:

private volatile boolean timeToQuit=false;
您还需要更改内部循环的条件,以注意
timeToQuit

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

您也可以添加对
中断的调用
,但由于您的线程距离检查标志的时间不会超过1秒,因此这是不必要的。

@rahultripath是的,可以这样做,但由于OP的代码每秒检查标志,所有这一切可以节省你是一个亚秒的延迟。明白了…实际上我只是想知道它是否正确使用中断这里或不…谢谢@RahulTripathi知道线程必须每秒检查一次标志,我可能不会添加对
interrupt()
的调用。如果轮询间隔超过两秒,我会添加一个对
interrupt()
的调用,不过:我的经验法则是,最终用户可以忍受亚秒级的延迟而不抱怨;任何超过一两秒钟的事情都会让他们感到焦虑,而五秒钟的延迟会让他们点击重新加载按钮;-)@用户2802270这是可能的。在屏幕上添加一个标签以进行调试,然后将
debugLabel.setText(“Stopped”)
添加到
stopRunning()
方法中,看看会发生什么。当我单击“停止”按钮时,“Stopped”出现了……所以我想我的调用方式没有问题吧?