我按开始按钮运行服务。在服务中运行主线程,其中我从db获取电话号码。 在获取数据后,我必须以不同的时间间隔完成一些任务。为此,我使用在 20秒暂停之后运行的计划。在暂停期间,我在暂停2秒后调用 doMyWork()(函数)。
我面临的问题是,当20秒计划完成其循环时, doMyWork()功能被调用两次,三次....等等。 其次,当我从活动中停止服务时, OnDestroy 方法会停止我的服务和MainThread但是在执行30次之前没有停止循环。
代码是
@Override
public void onCreate() {
super.onCreate();
// The service is being created
myThread.run();
}
private Runnable MainThread = new Runnable() {
public void run() {
try {
Cursor c = db.getNumbers(); // DB operation
scheduleTaskExecutor = Executors.newScheduledThreadPool(5);
// This schedule a runnable task every 20 seconds
scheduleTaskExecutor.scheduleAtFixedRate(new Runnable() {
public void run() {
for (int i = 0; i < 30; i++) {
Thread.sleep(2000); // Wait 2 Seconds
Log.v(TAG, " wait" + i );
doMyWork(); // perform this operation
}// for
}
}, 0, 20 , TimeUnit.SECONDS);
} catch (Exception e) {
// TODO: handle exception
}
}
};
Thread myThread = new Thread( MainThread);
@Override
public void onDestroy() {
super.onDestroy();
Log.v(TAG, "onDestroy()");
scheduleTaskExecutor.shutdown();
myThread.stop();
}
请给我建议如何在线程中使用多个计时器。
修改
我想要做的是运行循环代码。 假设循环有20次迭代,并且在每个循环循环中等待2秒,然后执行 doMyWork()。 scheduleTaskExecutor计时器是可变的而不是固定值。如果我给它一个10秒的值,就说。 然后它应该进行循环运行doMyWork()函数,暂停2秒。
这意味着当循环运行(i = 1,2,... 5)时,5次scheduleTaskExecutor(5 x 2 = 10)应该停止10秒。
等待之后应该从(i = 6,7,... 10)迭代运行循环。
迭代:
scheduleTaskExecutor Step 0
run
{
loop i = 0 till 20 Step 1
wait 2 seconds Step 2
doMyWork() Step 3
loop i = 1
wait 2 seconds
doMyWork()
loop i = 2
wait 2 seconds
doMyWork()
loop i = 3
wait 2 seconds
doMyWork()
loop i = 4
wait 2 seconds
doMyWork()
loop i = 5
wait 5 seconds
doMyWork()
}
scheduleTaskExecutor等待10步骤4
在步骤4之后再次转到步骤1
答案 0 :(得分:1)
您每20秒运行一次循环。
在循环中,你每隔2秒运行一次例程30次。
因此执行循环需要30 x 2秒。 (60秒)
第一个循环开始20秒后,您正在开始一个新循环..
所以在创作20秒后你就有了:
Loop 1 20/60 seconds complete.
Loop 2 0/60 seconds complete.
所以每2秒,doMyWork()
就会运行两次。
40秒后,你有:
Loop 1 40/60 seconds complete.
Loop 2 20/60 seconds complete.
Loop 3 0/60 seconds complete.
所以每2秒,doMyWork()
运行三次。
等等。
就你的最后一个问题而言,你需要告诉Runnable在销毁时停止。因此,需要一个全局变量来执行此操作,以便您可以访问Runnable。