使用 ScheduledExecutorService 仅在特定日期时间 运行 编码一次
Use ScheduledExecutorService to run code at specific Date time only once
我有一个代码必须在将来的某个日期时间执行,假设我有一个未来的日期并且我想执行一个安静的代码在该日期+1 分钟后,但只有一次。我知道我要用 java Timer 和 TimerTask 来做到这一点。例如做这样的事情:
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class Main {
public static void main(String[] args) {
Calendar myDate = Calendar.getInstance();
myDate.add(Calendar.MINUTE, 1);
Date afterOneMinute = myDate.getTime();
System.out.println("Scheduled at:" + afterOneMinute);
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("Executed at:" + (new Date()));
}
}, afterOneMinute);
}
}
我正在寻找一种优雅的方式来使用 ScheduledExecutorService,以便拥有一个特定的池,因为这个池将用于多个调用。
有人可以帮助我吗?
您可以使用ScheduledExecutorService.schedule(Runnable command, long delay, TimeUnit unit)
long delay = afterOneMinute.getTime() - System.currentTimeMillis();
ScheduledExecutorService executorService = ...;
executorService.schedule(runnable, delay, TimeUnit.MILLISECONDS);
您可以从 Executors
获得 ScheduledExecutorService
,获得 SingleThread
版本或 MultipleThread
Executors.newSingleThreadScheduledExecutor
然后提供runnable
、duration
及其TimeUnit
:ScheduledExecutorService.schedule(Runnable command, long delay, TimeUnit unit)
如果要设置持续时间:
ScheduledExecutorService exe = Executors.newSingleThreadScheduledExecutor();
// or Executors.newScheduledThreadPool(2); if you have multiple tasks
exe.schedule(() -> System.out.println("Executed at:" + (new Date())), 1, TimeUnit.MINUTES);
如果你想使用 LocalDateTime
:
ScheduledExecutorService exe = Executors.newSingleThreadScheduledExecutor();
// or Executors.newScheduledThreadPool(2); if you have multiple tasks
LocalDateTime date = LocalDateTime.of(2018, 6, 17, 18, 30, 0);
exe.schedule(
() -> System.out.println("Executed at:" + (new Date())),
LocalDateTime.now().until(date, ChronoUnit.MINUTES),
TimeUnit.MINUTES);
我有一个代码必须在将来的某个日期时间执行,假设我有一个未来的日期并且我想执行一个安静的代码在该日期+1 分钟后,但只有一次。我知道我要用 java Timer 和 TimerTask 来做到这一点。例如做这样的事情:
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class Main {
public static void main(String[] args) {
Calendar myDate = Calendar.getInstance();
myDate.add(Calendar.MINUTE, 1);
Date afterOneMinute = myDate.getTime();
System.out.println("Scheduled at:" + afterOneMinute);
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("Executed at:" + (new Date()));
}
}, afterOneMinute);
}
}
我正在寻找一种优雅的方式来使用 ScheduledExecutorService,以便拥有一个特定的池,因为这个池将用于多个调用。 有人可以帮助我吗?
您可以使用ScheduledExecutorService.schedule(Runnable command, long delay, TimeUnit unit)
long delay = afterOneMinute.getTime() - System.currentTimeMillis();
ScheduledExecutorService executorService = ...;
executorService.schedule(runnable, delay, TimeUnit.MILLISECONDS);
您可以从
Executors
获得ScheduledExecutorService
,获得SingleThread
版本或MultipleThread
Executors.newSingleThreadScheduledExecutor
然后提供
runnable
、duration
及其TimeUnit
:ScheduledExecutorService.schedule(Runnable command, long delay, TimeUnit unit)
如果要设置持续时间:
ScheduledExecutorService exe = Executors.newSingleThreadScheduledExecutor();
// or Executors.newScheduledThreadPool(2); if you have multiple tasks
exe.schedule(() -> System.out.println("Executed at:" + (new Date())), 1, TimeUnit.MINUTES);
如果你想使用 LocalDateTime
:
ScheduledExecutorService exe = Executors.newSingleThreadScheduledExecutor();
// or Executors.newScheduledThreadPool(2); if you have multiple tasks
LocalDateTime date = LocalDateTime.of(2018, 6, 17, 18, 30, 0);
exe.schedule(
() -> System.out.println("Executed at:" + (new Date())),
LocalDateTime.now().until(date, ChronoUnit.MINUTES),
TimeUnit.MINUTES);