簡體   English   中英

簡單的Java計時器不起作用

[英]Simple java timer not working

我是編程新手,使用以下代碼運行計時器。 當使用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();
}

我猜想您正在像countTime(true)這樣啟動計時器,並且要關閉它,您正在調用countTime(false)

您沒有注意到timer正在作為單獨的線程運行。 因此,再次調用將啟動一個新線程。 基本上,每個調用都會啟動一個新線程,而在以前運行的任何線程中都不會進行任何更新。

這是一個匿名Thread類,每次您調用countTime(boolean)方法時,該類都會創建一個新線程。

您可以添加“ 主叫方 ”代碼和代碼段設置為false嗎?

從當前代碼開始, countTime始終會啟動一個新線程。 那可能是原因。 沒有看到在哪里“ 運行 ”設置為假。

是否要始終啟動新線程? 如何以及你在哪里做奔跑為假的?

我認為您只需要一個線程,並且必須從調用方設置運行值“ true ”或“ false ”。 發布呼叫者代碼將有助於解決問題。

編輯:

1)分別聲明一個線程。 為“運行”布爾變量提供setter和getter方法。

2)當用戶單擊開始按鈕,單擊“開始”時,以run為true啟動線程。 如果用戶兩次單擊“開始”,請確保未創建第二個線程。 如果(thread == null)如果線程不為null,則創建新線程並忽略請求

3)當用戶單擊停止按鈕且線程不為null時,將運行設置為false。

通過調用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。 我也是編程的新手,並且遇到了類似的問題,希望可以為您提供幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM