在Java8中,生成具有无限循环的线程的最佳方法是什么?

在Java8中,生成具有无限循环的线程的最佳方法是什么?,java,multithreading,Java,Multithreading,我有一个方法需要每n秒调用一次。在Java的旧时代,我会这样做: Runnable task = () -> { while (!updater.isInterrupted()) { //some Task } catch (InterruptedException e) {} } }; Thread updater = new Thread(task); updater.start(); } 但这显然是个坏主意。如果我想停止线程,我需要调用update

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

Runnable task = () -> {

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

但这显然是个坏主意。如果我想停止线程,我需要调用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秒调用一个方法的最有效和“最新”的方法是什么呢?

使用
ScheduledExecutorService
是正确的方法。它不会创建PollingService的新实例,您创建它,执行器调用
在同一个实例上运行
,直到您取消
未来

顺便说一句,这在Java 8中不是新的,但在Java 7中引入了警告:
运行
方法中的所有代码都应该包装在
尝试
-
捕获
中。如果异常从代码中浮起并到达
ScheduledExecutorService
,则执行器将静默停止,并取消所有未来的计划运行。这个事实被隐藏在课堂文档的某个地方。