在我的应用程序中,我有一个计时器和停止/启动按钮。定时器适用于线程 当我点击按钮时,我的计时器开始工作。当我点击停止并开始它似乎我的线程作为2个并行线程。 如何停止第一个线程并创建第二个? 这是代码
timer = new Thread(new Runnable() {
@Override
public void run() {
final boolean cont = mSharedPreferences.getBoolean("continuesMode", false);
final boolean statemant = !stopedAlgo && !mUserStop;
if(!statemant){
timerMinutes = 0;
timerHours = 0;
}
while(statemant){
time="";
if(timerMinutes>=60){
timerMinutes = 0;
timerHours++;
}
if(timerHours<10)
time = "0" + String.valueOf(timerHours)+":";
else
time = String.valueOf(timerHours)+":";
if(timerMinutes<10)
time += "0" + String.valueOf(timerMinutes);
else
time += String.valueOf(timerMinutes);
HeadSense.this.runOnUiThread(new Runnable(){
public void run(){
boolean state = mContinuousMode && !stopedAlgo && !mUserStop ;
if(!stopedAlgo && cont){
mTfsValue.setText(time);
timerMinutes++;
}
else{
timerMinutes = 0;
timerHours = 0;
}
}
});
try {
Thread.sleep(1*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
timer.start();
答案 0 :(得分:1)
据我所知,你的第一个主题(或第二个)将永远不会因为以下行而停止:
final boolean statemant = !stopedAlgo && !mUserStop;
这是最终的,只会被评估一次而且永远不会改变。如果在您创建true
时它评估为Thread
,它将保持为真并继续运行。
答案 1 :(得分:0)
您需要在此处将布尔值statemant
声明为volatile
。这样做是为了向编译器提示某些优化不能被采用,因为这个变量是由外部线程修改的。
此外,您会对此感兴趣 - How to stop a java thread gracefully?