- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在按开始按钮运行服务。在服务中运行一个主线程,我在其中从数据库中获取电话号码。获取数据后,我必须在不同的时间间隔内完成一些任务。为此,我使用在 20 秒暂停 后运行的时间表。在那次暂停期间,我在暂停 2 秒后调用我的 doMyWork()(函数)。
我面临的问题是,当 20 秒的计划完成其周期时,doMyWork() 函数被调用两次、三次……等等。其次,当我从 Activity 中停止我的服务时,OnDestroy 方法停止我的服务和 MainThread,但直到它执行 30 次才停止 for 循环。
代码是
@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 秒。然后它应该进入循环运行 doMyWork() 函数并暂停 2 秒。
这意味着当 for loop run (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步
最佳答案
您每 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。
关于Android:如何从主 Activity 运行和停止多个线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14428706/
我是一名优秀的程序员,十分优秀!