Java Thread每隔X秒

Man*_*lva 38 java

以给定速率安排一段Java代码的最简单方法是什么?

cle*_*tus 83

在Java 5+中有ScheduledExecutorService:

ScheduledExecutorService exec = Executors.newSingleThreadScheduledExecutor();
exec.scheduleAtFixedRate(new Runnable() {
  @Override
  public void run() {
    // do stuff
  }
}, 0, 5, TimeUnit.SECONDS);
Run Code Online (Sandbox Code Playgroud)

上述方法是有利的.在Java 5之前,您使用TimerTimerTask:

timer.scheduleAtFixedRate(new TimerTask() {
  @Override
  public void run() {
    // do staff
  }
}, 0, 5000);
Run Code Online (Sandbox Code Playgroud)

  • 如果我关闭应用程序的主窗口怎么办?这个任务还在运行吗? (5认同)
  • 在 Java 8 中,你可以使用 lambda 表达式作为 Runnable 的实例:`ScheduledExecutorService exec = Executors.newSingleThreadScheduledExecutor(); exec.scheduleAtFixedRate(() -> { //做东西}, 1, 1, TimeUnit.SECONDS);` (2认同)

dev*_*ity 8

通过使用ScheduledExecutorService.

看看Executors.newScheduledThreadPool.它将允许您创建一个ScheduledExecutorService允许您Runnable定期提交s的程序.


fla*_*hon 6

while (true) {
    thread.sleep(1000)
    method();
}
Run Code Online (Sandbox Code Playgroud)

在许多情况下,会有更好的选择。但这是在1000ms + n的间隔内实现对method()的常规执行的最简单方法(其中n是执行method()所花费的时间)

当然,您可以输入所需的任何毫秒值,而不是1000。在另一个线程控制的标志上实现while循环也可能是一个想法。这样就有了一种无需停止程序就可以停止循环执行的方法。

  • 几乎-至少为1000。这取决于线程调度程序何时决定再次开始运行线程。这将是1000 + a + n(其中a是调度程序再次激活线程所需的时间) (3认同)

Ram*_*raj 5

使用下面的代码:

Timer timer = new Timer(); 
timer.schedule( new TimerTask() 
{ 
    public void run() { 
    // do your work 
    } 
}, 0, 60*(1000*1));
Run Code Online (Sandbox Code Playgroud)