java - Java 超时功能不适用于我的以下代码
问题描述
我尝试使用以下方法在 Java 中为我的 SQL 查询设置 1 秒的时间限制: 如何使线程超时
public class App {
public static void main(String[] args) throws Exception {
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<String> future = executor.submit(new Task());
try {
System.out.println("Started..");
System.out.println(future.get(1, TimeUnit.SECONDS));
System.out.println("Finished!");
} catch (TimeoutException e) {
future.cancel(true);
System.out.println("Terminated!");
}
executor.shutdownNow();
}
}
class Task implements Callable<String> {
@Override
public String call() throws Exception {
try {
// some codes to do query via SQL Server JDBC, assuming it takes 10 seconds.
ResultSet result = statement.executeQuery();
// some codes to print the query result
return "Done";
}
catch (Exception e) {
System.out.println();
e.printStackTrace();
}
}
}
但是,我发现虽然它在 1 秒后打印“终止”,但程序继续运行并在 10 秒后打印查询结果。它不起作用的原因是什么以及如何解决它?
解决方案
shutdownNow
实际上并没有停止线程,它只是发送线程可以执行的信号(中断)。在 Java 中停止线程很棘手,因为虽然您可以直接终止线程(使用Thread.stop
),但您真的不应该这样做,因为您不知道线程处于什么状态以及它将留下什么。
您可以在文档中找到更多信息。
推荐阅读
- powershell - 我的脚本将多个 Get-LocalGroupMember 命令的输出显示为一个对象。如何拆分它们?
- java - 如何使用spring-data在mongodb中创建全文搜索查询?
- python - python中的子域暴力破解
- assembly - 如何使用 MIPS 加载字
- php - 无法打开流:没有这样的文件或目录错误
- c - 比较目录 C 中所有文件的内容
- scala - 使用 Spark 和 Scala 的并行 API 请求
- php - 研究概率和可证明公平的开胸功能,我想对吗?
- json - 使用 jq 处理多个顶级元素
- sql - 如何将一个表中的记录集和其他记录集加载到ssis中的不同表中