首页 > 解决方案 > 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 秒后打印查询结果。它不起作用的原因是什么以及如何解决它?

标签: java

解决方案


shutdownNow实际上并没有停止线程,它只是发送线程可以执行的信号(中断)。在 Java 中停止线程很棘手,因为虽然您可以直接终止线程(使用Thread.stop),但您真的不应该这样做,因为您不知道线程处于什么状态以及它将留下什么。

您可以在文档中找到更多信息。


推荐阅读