gpt4 book ai didi

Android:如何从主 Activity 运行和停止多个线程?

转载 作者:行者123 更新时间:2023-11-30 03:49:10 26 4
gpt4 key购买 nike

我正在按开始按钮运行服务。在服务中运行一个主线程,我在其中从数据库中获取电话号码。获取数据后,我必须在不同的时间间隔内完成一些任务。为此,我使用在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com