我是编程新手,我使用以下代码来运行计时器。使用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();
}
答案 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。
我也是编程的新手,也有类似的问题,希望能帮助你