<分区>
您好,我遇到了有关超时分配给线程池 java 的任务的问题。
详细说明:
- 我已经实现了一个 API,它可以并行运行一些查询并返回响应。
- 有一个通过
Executors.newFixedThreadPool(40)
创建的固定线程池。每当有人调用此 API 时,一组 10 个任务就会在此线程池上进行调度。这些任务在内部对 Mysql 执行一组查询。 - 我必须以 6-7 秒的 SLA 返回 API 的响应。所以我必须为线程池上安排的所有 10 个任务创建一个超时。我知道如何使单个任务超时(它抛出一个中断的异常,尽管线程只有在它启动后完成时才会变得空闲)。
- 我也不想让线程池重载。因此,我为通过分配给该线程池的任务运行的所有查询创建了 60 秒的超时。因此,线程可以在一分钟内自由地执行另一项任务。
问题:
有没有优雅的方法来解决这个问题?
@Component
public class MyHandler {
@PostConstruct
public void init() {
/*
* Naming thread pool to identify threads in the thread dump
* */
ThreadFactory threadFactory = new ThreadFactoryBuilder()
.setNameFormat("my-thread-%d").build();
executorService = Executors.newFixedThreadPool("40", threadFactory);
}
@PreDestroy
public void destroy() {
executorService.shutdown();
}
public void update() {
List<Future<Boolean>> results = new ArrayList<>();
results.add(executorService.submit(new Callable<Boolean>() {
@Override
public Boolean call() throws Exception {
executeQuery();
return true;
}
}));
/*
* 9 more such tasks
*/
for (Future<Boolean> result : results) {
try {
result.get();
} catch (InterruptedException | ExecutionException e) {
LOGGER.error("Failed with unknown error", e);
}
}
}
}
executeQuery()
的超时时间为 60 秒。