在Java 8中使用无限循环生成Thread的最佳方法是什么?

时间:2016-01-30 18:42:59

标签: java multithreading

我有一个方法需要每n秒调用一次。在Java的旧时代,我会做这样的事情:

Runnable task = () -> {

  while (!updater.isInterrupted()) {
       //some Task
    } catch (InterruptedException e) {}
   }
};
Thread updater = new Thread(task);
updater.start();

}

但这显然是一个坏主意。如果我想要停止Thread,我需要调用updater.interrupt()并依赖异常处理,这实际上并不是针对这些东西做的。

所以我猜有一些奇特的“新”Java8方式。我已经看到了这个:

public class TestSchedularService {
 long sleep = 500;

 @Test
 public void testLoop2() throws Exception {
ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
ScheduledFuture future = executor.scheduleWithFixedDelay(new PollingService(), 0, sleep,TimeUnit.MILLISECONDS);
Thread.sleep(2 * sleep);
future.cancel(false);
executor.shutdown();
 }
}

class PollingService implements Runnable {
 private int count = 0;
public void run() {
System.out.println("iteration :" + (count++));
 }
}

但似乎它正在每次调用时创建一个PollingService实例,这看起来很糟糕。那么每n秒调用一个方法最有效和“最新”的方法是什么?

1 个答案:

答案 0 :(得分:3)

使用ScheduledExecutorService是正确的方法。它不创建PollingService的新实例,您创建它并且执行程序始终在同一实例上调用run,直到您取消Future