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

时间:2013-01-20 20:04:58

标签: android multithreading timer

我按开始按钮运行服务。在服务中运行主线程,其中我从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

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。