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

ActionListener中添加了日期格式的ScheduledExecutorService

胡泓
2023-03-14

我知道在Java中,可以使用ScheduledExecutorService在一定延迟后执行特定任务。这篇文章展示了如何在特定日期执行任务,但不是使用SimpleDataFormat。例如,我有一个如下初始化的格式

dateFormatter = new SimpleDateFormat("MM-dd-yyyy hh:mm aa");

此外,我想执行在ActionListener中的else if语句下声明的特定任务,例如:

foo.addActionListener(e -> {
            if (condition) {

            // some task

            } else if (some other condition) { // what I want to be executed at particular date

            // some other task

            } else {

            // another task

            }
        });

如何初始化在特定日期在SimpleDateFormat内和/或使用其他语句执行的SchduledExecutorService,最好使用SimpleDateFormat

共有2个答案

宣星光
2023-03-14

一定要使用java。time,用于日期和时间工作的现代Java日期和时间API。取代旧的SimpleDateFormat的现代类是DateTimeFormatter

static DateTimeFormatter formatter
        = DateTimeFormatter.ofPattern("MM-dd-yyyy hh:mm a", Locale.ENGLISH);

编辑:正如Basil Bourque在评论中所说,还可以在某个地方声明你的遗嘱执行人服务,当你不再需要时可以关闭它。例如:

static ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);

现在在您的操作监听器(或您可能喜欢的任何其他地方)中,您可以执行以下操作:

        } else {
            String timeString = "04-01-2020 08:00 AM";
            ZoneId zone = ZoneId.of("America/Curacao");
            ZonedDateTime timeToExecute = LocalDateTime.parse(timeString, formatter)
                    .atZone(zone);
            long delaySeconds = ChronoUnit.SECONDS.between(
                    ZonedDateTime.now(zone), timeToExecute);
            executor.schedule(() -> System.out.println("It’s now " + timeString),
                            delaySeconds, TimeUnit.SECONDS);
        }

请记住关闭执行程序以通过调用释放资源

    executor.shutdown();

或者,如果您想取消已经安排的任务,请改用Shutdown Now()

我已经为所需的时间和时区设置了非常随机的值,所以请插入您的值。如果需要JVM的时区设置,ZoneId。systemDefault()是一个选项。

在许多其他优点中java.time更好地支持计算从现在到所需计划时间的时间间隔长度。如果您需要比秒更高的精度,请使用毫秒、微秒甚至纳秒,它的方式非常相似(因为您的字符串似乎只有分钟的精度,我认为没有必要)。

你提到的SimpleDateFormat是一个臭名昭著的麻烦制造者,你永远不会喜欢使用它。幸运的是,它也早已过时。

Oracle教程:Date Time讲解如何使用java.time.

卫宏硕
2023-03-14

如何初始化在else if内和/或与else if一起执行的ScheduledExecutorService

你没有。

不要在需要时初始化executor服务。

您可以更早地在其他地方实例化计划执行器服务,并在命名变量中保留一个引用。稍后根据需要调用该executor服务对象。

executor服务可以被调用在应用程序的其他部分运行其他类型的任务。executor服务不需要仅绑定到一种任务。

重要信息:您必须保留对该executor服务的引用,以便它的后台线程池可以在某个时刻正常关闭。否则,线程池可能会在其原始应用程序结束后继续运行。

一般来说,我建议采用这种方法。

  • 当应用程序启动时,建立您的执行器服务。保留一个引用,以便以后通过您选择的全局变量访问。也许是Singleton,或Service Locator,或依赖注入,例如传递给构造函数。
  • 在您的应用程序运行期间,找到现有的执行器服务。提交要运行的任务。
  • 当应用程序结束时,找到现有的执行器服务。调用其关闭方法以结束其支持线程池。

搜索堆栈溢出。这个话题已经讨论过很多次了。您将找到示例代码和进一步的讨论。

使用执行器实用程序类来实例化执行器服务。

ScheduledExecutorService ses = Executors.newSingleThreadScheduledExecutor() ; 

ses引用存储在应用程序中的某个位置。

计算等待的时间,如Ole V.V.的正确答案所示。

foo.addActionListener(
    e -> {
        if (condition) {

            doSomethingNow() ;

        } else if (some other condition) { 

            long delaySeconds = … ;  // See: https://stackoverflow.com/a/60963540/642706
            ScheduledExecutorService scheduledExecutorService = Objects.requireNonNull​( … ) ;  // Locate the existing scheduled executor service.
            Runnable task = () -> { System.out.println( "Doing something later. " + Instant.now() ) ; };
            scheduledExecutorService.schedule(
                task ,
                delaySeconds ,
                TimeUnit.SECONDS
            );

        } else {

            doSomethingElseNow() ;

        }
    }
);

当您的应用退出时,请关闭该计划的执行程序服务。

// In the hook for app shut-down.
ScheduledExecutorService scheduledExecutorService = Objects.requireNonNull​( … ) ;  // Locate the existing scheduled executor service.
scheduledExecutorService.shutdown() ;
 类似资料:
  • 问题内容: 如何从日期转换该日期时间? 从此:2016-02-29 12:24:26 至:2016年2月29日 到目前为止,这是我的代码,它返回nil值: 问题答案: 您必须声明2 different ,第一个将字符串转换为a ,第二个以您的格式打印日期。 试试这个代码: Swift 3及更高版本: 从斯威夫特3 类已更改为与对。

  • 设定年月日的排列顺序。

  • 问题内容: 调用a 并获取列的响应将日期值设置为 但。目前,我有一个类似的日期值。我想将此值转换为Edm.DateTIme格式,如上所示。 任何功能都可以实现相同。任何工作。请帮忙。 问题答案: 下列: 打印出: 请注意时区的转换。Java 希望在偏移量中使用冒号。 说到时区,我不知道OData Atom XML是否在某处指定了时区。Edm.DataTime没有此类功能。 编辑 :如果要将输出转换

  • 问题内容: 我正在使用角度以这种格式显示日期 如何显示像 使用角 有没有使用Angular JS-的直接方法(我可以使用普通的jQuery) 问题答案: 使用日期的角度过滤器。 请参阅以下链接。 http://docs.angularjs.org/api/ng.filter:date

  • 我创建了一个JPanel,上面有我需要的所有JRadioButtons(称为PortSettings)。我还有一个按钮,叫做端口设置,当用户单击该按钮时,我需要JPanel上来显示单选按钮。我尝试将JPanel添加到actionlistener中,但没有效果。我的代码在下面。除了portsettings按钮之外,我已经从其他按钮中删除了所有其他ActionListener。如果这个问题让人困惑,我

  • 嗨,我正试图将数据从一个文件加载到Oracle中的一个表中,但我遇到了一个错误ORA-01843:在插入日期时不是一个有效的月份。 干杯