如何仅终止在执行器服务中超时的线程



我是Java多线程的新手,所以我的问题可能不合理。请帮助我了解它是如何工作的。

ExecutorService executor = Executors.newCachedThreadPool();
            List<Future<Boolean>> futures = new ArrayList<>();
            for (int i = 0; i < emailAddressList.size(); i++) {
                futures.add(executor.submit(new Verify(emailAddressList.get(i))));
            }           
            executor.shutdown();
            while(!executor.awaitTermination(3, TimeUnit.SECONDS));
            for (int i = 0; i < emailAddressList.size(); i++) {
                bufferedWriter.write(emailAddressList.get(i) + "|" + futures.get(i).get());
                bufferedWriter.newLine();
            }
            bufferedWriter.close();

在等待终止循环中,我将超时设置为 3 秒。我在这里试图实现的是,在此超时期间,我想终止所有已存活至少 3 秒的线程。但是我如何识别呢?

它们会自动终止。你的循环是无用的。

给任务终止 3 秒的时间,如果任务尚未完成,则除了调用尝试强制停止正在运行的线程的 shutdownNow() 之外,您不能做太多事情。如果您认为任务需要三秒以上,请增加超时,但循环没有用。

事实上,等待所有任务终止可能没有用。 如果结果不可用,Future.get()将阻止,因此您可以开始循环浏览结果。当然,如果Verify执行一些潜在的危险操作(例如长时间运行而没有超时的网络操作),这可能会阻止所有内容。但这应该在Verify中修复,而不是在此代码中。

相关内容

  • 没有找到相关文章

最新更新