简单的java计时器不工作

时间:2015-10-17 07:18:52

标签: java

我是编程新手,我使用以下代码来运行计时器。使用boolean run = true调用此方法时,它正常工作,但在boolean run = false时不会停止。我该如何解决这个问题?

    private void countTime(boolean run){
        new Thread(){
            public void run(){
                int mm = 00;
                int hh = 00;
                while(run){
                    for (int i=1 ;i<61 ;i++){
                        try{
                            int ss = i;
                            Thread.sleep(1000);
                            if (ss == 60){
                                mm += 1;
                                if (mm == 60){
                                }
                            }
                            if (mm == 60){
                                hh += 1;
                                mm = 0;
                            }
                            if (ss < 10){
                                lblClock.setText(Integer.toString(hh) + ":" + 
                                        Integer.toString(mm) + ":" + "0" 
                                        + (Integer.toString(ss))
                                );
                            } else {
                                lblClock.setText(Integer.toString(hh) + ":" + 
                                        Integer.toString(mm) + ":" 
                                        + (Integer.toString(ss))
                                );
                            }
                        } catch (InterruptedException ex) {
                        }
                    }
                }
            }
        }.start();
}

3 个答案:

答案 0 :(得分:4)

我猜你正在启动像countTime(true)这样的计时器,要关闭它,你正在调用countTime(false)

您没有注意到timer作为单独的线程运行。所以再次调用你正在启动一个新线程。基本上每个调用都会启动一个新线程,任何先前运行的线程都不会更新任何内容。

这是一个匿名Thread类,每次调用countTime(boolean)方法时都会创建一个新线程。

答案 1 :(得分:1)

您可以添加&#34; 来电者&#34;代码和代码段设置运行为false?

从当前代码开始, countTime 始终会启动一个新的线程。这可能是原因。没看到&#34; 运行&#34;被设为假。

您想要始终开始新主题吗?以及如何以及在哪里运行为假?

我认为您只需要一个帖子,您必须设置运行值&#34; true &#34;或&#34; false &#34;来自来电者。发布来电者代码有助于解决问题。

修改

1)分别声明一个线程。为&#34; run&#34;提供setter和getter方法。布尔变量。

2)当用户点击开始按钮时,单击&#34;开始&#34;,以run as true启动该线程。如果用户单击“开始”两次,请确保未创建第二个线程。如果(thread == null)创建新线程并且如果线程不为null则忽略该请求

3)当用户点击停止按钮&amp; thread不为null,将run设置为false。

答案 2 :(得分:0)

通过调用countTime(false),您只需启动另一个线程。如果您将时间消息打印到控制台并单击两次启动按钮,您会发现有两个计时器正在运行。 要停止该线程,您可能会这样做:

Thread thread=new Thread(){
public void run(){
//your timer code here
}};
public synchronized void stop(){
        if(null != thread){
            thread.interrupt();
            thread = null;
            notifyAll();
        }
}
public void start(){
        if(null == thread){
            thread = new Thread(this);
            thread.start();
        }
}

如果您要启动该主题,请致电start(),然后stop()停止该主题。

为什么这样做?当线程处于阻塞状态时(通过调用Thread.sleep(1000))然后调用thread.interrupt()让它抛出InterruptedException。 我也是编程的新手,也有类似的问题,希望能帮助你