【发布时间】:2017-01-05 11:09:26
【问题描述】:
我已经在新线程中启动了一些进程:
FutureTask<?> futureTask = new FutureTask<Void>(() -> {
startSomeProcess();
}, null);
在startSomeProcess 方法中,我为每个项目生成报告:
for (Item item : items) {
if (Thread.interrupted()) {
logger.info("currentThread isInterrupted");
return;
}
generateReport(item);
}
在generateReport() 方法中,我对DB 执行一些选择并从ResultSet 生成excel 报告:
try (PreparedStatement ps = conn.prepareStatement(query.toString(),
ResultSet.TYPE_SCROLL_INSENSITIVE)) {
ResultSet rs = ps.executeQuery();
//and fill excel from rs
...
但是我的ps.executeQuery(); 可以执行很长时间(1 sec- 999999h.
我有取消按钮。如果它按我做这个
futureTask.cancel(true);
并检查startSomeProcess(); 方法中的异常。但我无法检查和中断ps.executeQuery();。当我使futureTask.cancel(true); 这个executeQuery 抛出异常时。但我没有配置这个。它是自动的。
我的问题:当我中断线程时 - 我是否可以或是否让自己中断对数据库的查询,或者它只是发生并且我必须只处理错误?
编辑:
用户发送命令 - “取消报告生成”。我找到 futureTask 并调用 cancel() 方法。并打破构建报告。但是如果 ps.executeQuery();已经开始了——不知道怎么破
【问题讨论】:
标签: java multithreading interrupt spring-jdbc futuretask