当前位置: 首页 > 面试题库 >

如何安排任务运行一次?

汪跃
2023-03-14
问题内容

我要延迟设置某项倒计时计时器的时间,该计时器将在一定时间后“做某事”。

我希望我的程序的其余部分在等待时继续运行,所以我尝试制作自己的程序Thread,其中包含一分钟的延迟:

public class Scratch {
    private static boolean outOfTime = false;

    public static void main(String[] args) {
        Thread countdown = new Thread() {
            @Override
            public void run() {
                try {
                    // wait a while
                    System.out.println("Starting one-minute countdown now...");
                    Thread.sleep(60 * 1000);

                    // do the thing
                    outOfTime = true;
                    System.out.println("Out of time!");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };
        countdown.start();

        while (!outOfTime) {
            try {
                Thread.sleep(1000);
                System.out.println("do other stuff here");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

尽管这种方法行之有效,但似乎应该有一种更好的方法。

我不需要任何复杂的东西。我只想在一定时间后做一件事情,而让程序的其余部分仍然运行。

我应该如何安排一次任务来“做某事”?


问题答案:

虽然过去java.util.Timer曾经是安排未来任务的好方法,但现在最好使用1代替java.util.concurrent包中的类。

有一个ScheduledExecutorService专门设计用于延迟后运行命令(或定期执行命令,但这与该问题无关)。

它有一种schedule(Runnable, long, TimeUnit)方法

创建并执行一次操作,该操作在给定的延迟后启用。

使用a ScheduledExecutorService可以这样重新编写程序:

import java.util.concurrent.*;

public class Scratch {
    private static final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
    public static void main(String[] args) {
        System.out.println("Starting one-minute countdown now...");
        ScheduledFuture<?> countdown = scheduler.schedule(new Runnable() {
            @Override
            public void run() {
                // do the thing
                System.out.println("Out of time!");
            }}, 1, TimeUnit.MINUTES);

        while (!countdown.isDone()) {
            try {
                Thread.sleep(1000);
                System.out.println("do other stuff here");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        scheduler.shutdown();
    }
}

通过这种方式获得的好处之一就是ScheduledFuture<?>从调用中得到的对象schedule()

这样,您就可以摆脱多余的boolean变量,而直接检查作业是否已运行。

如果您不想再等待计划的任务,则可以通过调用其cancel()方法来取消它。

1看到Java Timer vsExecutorService吗?出于避免使用Timer赞成的原因ExecutorService



 类似资料:
  • 我在Tomcat中部署了一个web应用程序。我有一套代码,它检查数据库中的某些数据,然后根据这些数据向用户发送邮件。有人能建议如何在Tomcat中安排这项工作吗。

  • 我有一个优化代码运行在sagemaker。我想每1小时运行一次代码。我怎么能在sagemaker安排跑步?。我不想调用模型endpoint,但我想在每1小时运行整个代码。

  • 我有一大堆Scalaz任务。创建方式如下: 我希望这些任务并行运行。以随机顺序打印数字,不要花5秒钟(每个任务有50个任务和100毫升睡眠)。 但是,很明显,每个任务需要100毫秒,所有任务都需要5秒钟,并且创建的列表是有序的。 如何并行运行它们?任务在哪里运行线程?

  • 问题内容: 我需要安排任务以固定的时间间隔运行。如何在长间隔(例如每8个小时)的支持下执行此操作? 我目前正在使用。是否支持长时间间隔? 问题答案: 使用:

  • 问题内容: 我的Java Scheduler有一个问题,我的实际需要是我必须在特定时间启动我的进程,并且我将在特定时间停止,我可以在特定时间启动我的进程,但是我不能在特定时间停止我的进程,如何指定进程在调度程序中运行多长时间(在这里我不会放),任何人对此都有建议。 问题答案: 您可以使用带有2个计划的计划,一个计划运行任务,另一个计划终止任务-参见下面的简化示例:

  • 问题内容: 我有以下使用类的课程。所以我想做的是,在运行cp1实例处理方法的同时,我要并行运行。 但是,我要按顺序cp1,所以我要它运行并完成,如果cp2没有完成或失败,那就很好。如果确实失败,我想加入结果。该示例中未返回任何内容,但我想返回结果。 为此,应该使用TaskExecutor吗?还是线程? 我只希望cp2与cp1并行运行。或者,如果我添加更多内容,例如说cp3,我希望它也可以与cp1并