线程以特定时间间隔在JAVA中运行特定时间

时间:2015-11-06 11:50:17

标签: java android multithreading thread-sleep

我想在JAVA中使用下面提到的操作进行android开发。

  1. 持续30秒,每1秒运行一次F1()(产生30个F1通话)。
  2. 永远运行线程t1
  3. 上述步骤应按顺序执行。 我尝试了ExecutorService,但没有成功。

    这是我的参考代码

    final Handler h = new Handler();
    final int delay = 1000; //milliseconds
    ExecutorService executor = Executors.newFixedThreadPool(1);
    
    Thread t1 = new Thread(new Runnable() {
        @Override
        public void run() {
            F1();
        }
    });
    
    for(int i=0;i<30;i++){
        executor.submit(t1);
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    
    executor.shutdown();
    //Step 2 (THe Second Thread)
    
    h.postDelayed(new Runnable() {
        public void run() {
            AnotherFunction()
            h.postDelayed(this, delay);
        }
    }, delay);
    

3 个答案:

答案 0 :(得分:1)

通常,ExecutorService更适合此类操作。这是一个很好的post,用于描述TimerExecutorService的差异和功能。

至于你的问题 - 它可以用这样的方式实现:

// here are Runnables with test logic
Runnable foo = new Runnable() {
    @Override
    public void run() {
        Log.d(">>>", "foo");
        onTaskFinished();
    }
};

Runnable longRunning = new Runnable() {
    @Override
    public void run() {
        try {
            Log.d(">>>", "longRunning started");
            Thread.sleep(5000);
            Log.d(">>>", "longRunning finished");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
};

// and here is valuable logic
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
ScheduledFuture<?> schedulerHandler;
volatile AtomicInteger tasksNum = new AtomicInteger(0);

private synchronized void onTaskFinished(){
    if(tasksNum.incrementAndGet() >= 30){
        scheduler.execute(new Runnable() {
            @Override
            public void run() {
                schedulerHandler.cancel(true);
            }
        });
        scheduler.execute(longRunning);
    }
}

然后开始操作只需调用此命令:

schedulerHandler = scheduler.scheduleAtFixedRate(foo, 0, 1, TimeUnit.SECONDS);

答案 1 :(得分:0)

您可以考虑使用java.util.Timerjava.util.TimerTask

答案 2 :(得分:0)

如果您正在按照我认为您正在执行的操作,您可以 @erosb 暗示,请使用TimerTimerTask安排方法执行以固定的比率。

以下内容适合您。

final int DELAY_BEFORE_START = 0;
final int RATE = 1000; 

Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
    @Override
    public void run() {
        F1();
    }
}, DELAY_BEFORE_START, RATE);