运行 在新线程中安排
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
并将其保存在某处,但是基于来自的代码你的问题,你不需要。
我正在查询 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 的构造函数
说 classScheduledExecutorService
是个不错的选择,但是你用错了:
首先,您不需要创建 Thread
只是为了从中安排任务。它没有增加任何功能,只会浪费资源。
其次,在调用 shutdown()
之后,您的 scheduler
将不再接受任务,如果您需要生成多个报告,这就很糟糕了。
第三,由于您的代码在任务完成后不执行任何操作,因此您根本不需要调用 get()
。
因此,您唯一需要的代码是:
scheduler.schedule(() -> {
try {
new GetReportList().run(requestId);
} catch (Exception e) {
e.printStackTrace();
}
}, 5, TimeUnit.MINUTES);
它将安排一个任务并立即释放您的线程。该任务将在五分钟后在由 scheduler
.
如果您需要对计划任务进行一些控制(检查它们的状态、取消它们等),您可以从 schedule()
获取 Future
并将其保存在某处,但是基于来自的代码你的问题,你不需要。