当前位置: 首页 > 知识库问答 >
问题:

使用ScheduledExecutorService仅在特定日期和时间运行代码一次

瞿健
2023-03-14

我有一个代码必须在未来的某个日期执行,比如说我有一个未来的日期,我想在未来的1分钟内执行一段代码,但只执行一次。我知道我需要用java定时器和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);
    }

}

我正在寻找一种优雅的方式来使用SchduledExecutorService,以便有一个特定的池,因为这个池将用于多个调用。有人能帮我吗?

共有2个答案

刘向阳
2023-03-14

您可以使用ScheduledExecutorService。时间表(可运行命令、长延迟、时间单位)

long delay = afterOneMinute.getTime() - System.currentTimeMillis();
ScheduledExecutorService executorService = ...;
executorService.schedule(runnable, delay, TimeUnit.MILLISECONDS);
酆华皓
2023-03-14

>

然后提供runnable持续时间及其TimeUnitschduledExecutorService.schedule(Runnable命令,长延迟,TimeUnit单元)

如果要设置持续时间:

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);
 类似资料:
  • 当我把逻辑放在一个可运行的线程中时,它工作得很好,只是我不能与UI线程交互。所以我试图把所有的东西都放在一个类中,这个类扩展了Task,除了Task只执行一次之外,其他的都可以工作。没有错误,我从Task successed方法获得一条successed消息。 我还尝试在call方法中使task return Boolean为true,但这没有帮助。 请注意,此代码实际上存在于控制器中,但我将其放

  • 问题内容: 我想每天早上5点执行某项任务。因此,我决定使用它,但到目前为止,我已经看到了一些示例,这些示例显示了如何每隔几分钟运行一次任务。 而且我找不到任何示例来说明如何每天在特定时间(上午5点)每天运行任务,并且还考虑了夏时制的事实- 以下是我的代码,每15分钟运行一次- 有什么办法,我可以考虑兼顾夏时制的事实,安排一个任务在每天的凌晨5点运行? 而且对于这个还是更好? 问题答案: 与当前的J

  • 问题内容: 如何设置在特定时间仅运行一次文件?替代方法之一是,但并非所有标准托管计划的用户都可以访问。因此,我想知道是否有办法使用? 问题答案: 尝试在2011年3月30日午夜执行命令: 警告 :如评论所述,cron的标准/默认实现不支持 year 列。请参考下面的TomOnTime答案,以了解将来在cron的标准实现中在特定时间运行脚本的正确方法。

  • 我们要求每个月1日(时间: 00:00:00 AM)准确地运行一个作业。 我们使用Spring框架的计划时间任务来使用延迟和周期属性来计划作业。此类不支持在特定日期运行作业。 有人能建议我们如何使用Spring和Java技术解决这个问题吗?

  • 问题内容: 我正在使用Quartz-Scheduler执行重复性任务,但遇到了麻烦。在我的服务器端,我的用户想要指定一些日期范围,例如 From with in 到 说明: 从到但仅在之间运行作业 我在为其编写Cron表达式时遇到了麻烦,而且我的用户不是技术人员,所以我的用户希望我从两个时间戳值中自动创建Cron表达式。 请帮帮我。让我知道是否还有其他方法。 我在Google上看到了很多资源,但仍

  • 我希望一个进程在我启动我的网络服务后运行,然后每隔30分钟左右运行一次(我现在用较小的延迟测试它,只是为了看看它是否工作),但是我的进程从来不会运行超过一次。我做错了什么? 这是我的密码: