运行 在新线程中安排

Run schedule in new thread

我正在查询 API 以创建报告并希望在 5 分钟后加载该报告。我想为此使用 ScheduledExecutorService。因为我不希望 Executor 阻塞我的线程,所以我为此创建了一个新线程,但不确定这是否是正确的方法。这是我的代码:

Thread thread = new Thread() {
        public void run() {
            log.info("Starting...");
            new RequestReport().runScheduledTask(requestId);
        }
    };
thread.start();

private void runScheduledTask(String requestId) {
    log.info("Starting five-minute countdown now...");
    ScheduledFuture<?> countdown = scheduler.schedule(() -> {
        try {
            new GetReportList().run(requestId);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }, 5, TimeUnit.MINUTES);

    try {
        countdown.get();
    } catch (InterruptedException | ExecutionException e) {
        log.info("catched Exception");
        e.printStackTrace();
    }
    scheduler.shutdown();
}

有没有更好的方法 运行 5 分钟后一个函数?我这样做的方式好吗?我应该改变什么?

顺便说一句,我正在使用 spring - 有什么东西可以让它变得更好吗?

如果您想更多地 'correct' 了解代码,您可以将 RequestReport 分离到它自己的 class 实现 Runnable 接口,并传递一个实例对 Thread 的构造函数

说 class

ScheduledExecutorService是个不错的选择,但是你用错了:

首先,您不需要创建 Thread 只是为了从中安排任务。它没有增加任何功能,只会浪费资源。

其次,在调用 shutdown() 之后,您的 scheduler 将不再接受任务,如果您需要生成多个报告,这就很糟糕了。

第三,由于您的代码在任务完成后不执行任何操作,因此您根本不需要调用 get()

因此,您唯一需要的代码是:

scheduler.schedule(() -> {
    try {
        new GetReportList().run(requestId);
    } catch (Exception e) {
        e.printStackTrace();
    }
}, 5, TimeUnit.MINUTES);

它将安排一个任务并立即释放您的线程。该任务将在五分钟后在由 scheduler.

管理的单独线程中执行

如果您需要对计划任务进行一些控制(检查它们的状态、取消它们等),您可以从 schedule() 获取 Future 并将其保存在某处,但是基于来自的代码你的问题,你不需要。