1

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

4

1 回答 1

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。

于 2013-01-20T20:31:35.637 回答