使用scheduleAtFixedRate()重复使用循环的线程与重复runnable

时间:2014-01-05 01:00:46

标签: java multithreading

final Runnable refresh = new Refresh(params...);
service = Executors.newScheduledThreadPool(1);
service.scheduleAtFixedRate(refresh, 0, 2000, TimeUnit.MILLISECONDS);

// OR

final Thread refresh = new Refresh(params...);
refresh.start(); // In the run() method there is a loop with a sleep of 2000 ms

重复一段代码的上述哪种方法更受欢迎?为什么?

2 个答案:

答案 0 :(得分:2)

它在功能上是等同的,但前者更灵活,责任更好(SRP):任务不应该对它的运行方式和时间负责......

答案 1 :(得分:1)

  1. 固定费率的安排与休眠不同。 scheduleAtFixedRate调用在上一次执行开始后每n毫秒运行一次,而睡眠将在上一次执行结束后开始休眠,因此每次后续执行都将延迟运行所花费的时间。因此,您应该使用scheduleWithFixedDelay或测量从睡眠时间运行和提取所需的时间
  2. 出于多种原因,使用ExecutorService会更好。首先,正如assylias所提到的,您将代码与您选择运行它的方式分开。其次,ExcutorService有额外的代码来管理线程的生命周期,执行和优先级。
  3. 如果您使用1个线程,请查看Timer和TimerTask