我不确定这是否会按预期工作。实际上,keepAlive是用于IDLE线程的,并且我不知道您等待资源的线程是否在IDLE中。此外,仅当线程数大于内核数时,除非监视线程池,否则您无法真正知道何时发生。
keepAliveTime-当线程数大于内核数时,这是多余的空闲线程将在终止之前等待新任务的最长时间。
您可以执行以下操作:
public class MyTask {
private final long timeout;
public MyTask(long timeout) {
this.timeout = timeout;
}
@Scheduled(cron = "")
public void cronTask() {
Future<Object> result = doSomething();
result.get(timeout, TimeUnit.MILLISECONDS);
}
@Async
Future<Object> doSomething() {
//what i should do
//get ressources etc...
}
}
不要忘记添加 @EnableAsync
无需@Async
实现Callable 也可以执行相同操作。
编辑:请记住,它将等待直到超时,但是运行任务的线程不会被中断。发生TimeoutException时,您将需要调用Future.cancel。并在任务中检查isInterrupted()以停止处理。如果要调用api,请确保已选中isInterrupted()。