我正在通过按开始按钮运行服务。在服务中运行一个主线程,我从数据库中获取电话号码。获取数据后,我必须以不同的时间间隔执行一些任务。为此,我使用了在20 秒 pause后运行的 schedule 。在该暂停期间,我在 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();
}
请给我建议如何在线程中顺序使用多个计时器。
编辑
我想做的是运行循环代码。假设 Loop 有 20 次迭代,并且在每个循环循环中等待 2 秒,然后再执行doMyWork()。scheduleTaskExecutor 计时器是可变的而不是固定值。假设我给它一个值 10 秒。然后它应该去 for 循环运行 doMyWork() 函数,暂停 2 秒。
这意味着当 for 循环运行 (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 步