Java 如何仅终止ExecutorService中已超时的线程?

Java 如何仅终止ExecutorService中已超时的线程?,java,multithreading,threadpool,executorservice,Java,Multithreading,Threadpool,Executorservice,我不熟悉Java多线程,所以我的问题可能不合理。请帮助我理解它是如何工作的 ExecutorService executor = Executors.newCachedThreadPool(); List<Future<Boolean>> futures = new ArrayList<>(); for (int i = 0; i < emailAddressList.size(); i++) {

我不熟悉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();
ExecutorService executor=Executors.newCachedThreadPool();
列表期货=新的ArrayList();
对于(int i=0;i

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

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

您将给任务3秒钟的终止时间,如果任务尚未完成,那么除了调用
shutdownNow()
尝试强制停止正在运行的线程外,您将无法执行其他操作。如果您认为任务需要超过三秒,请增加超时时间,但循环没有用


事实上,等待所有任务的终止可能是没有用的<如果结果不可用,code>Future.get()
将被阻止,因此您可以开始循环查看结果。当然,如果
Verify
执行一些潜在的危险操作(如长时间运行的网络操作而不超时),这可能会阻止一切。但这应该在
验证中解决,而不是在此代码中。

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

您将给任务3秒钟的终止时间,如果任务尚未完成,那么除了调用
shutdownNow()
尝试强制停止正在运行的线程外,您将无法执行其他操作。如果您认为任务需要超过三秒,请增加超时时间,但循环没有用


事实上,等待所有任务的终止可能是没有用的<如果结果不可用,code>Future.get()
将被阻止,因此您可以开始循环查看结果。当然,如果
Verify
执行一些潜在的危险操作(如长时间运行的网络操作而不超时),这可能会阻止一切。但这应该在
验证
中解决,而不是在这个代码中。

我可以这样做。但是,shudowNow()也会终止队列中的所有作业,对吗?包括正在运行的任务,对吗?它返回队列中所有未开始执行的任务。它将试图通过中断线程来停止运行任务。如果设置了适当的超时,调用
shutdown()
可能就足够了。如果超时超过并且可能出现问题,那么您需要
shutdownNow()
。我知道它会返回未执行的任务,您是否建议,然后我将这些未使用的任务再次提交给执行者以使其工作?除非您希望
验证
作业表现不好,否则我根本不会使用
等待终止
。你已经关闭了该池,你可以在未来完成时继续打印电子邮件。问题是每个线程要执行的作业可能需要5分钟到1小时的时间。我不希望我的任何线程继续执行超过8分钟。你建议我怎么做?我可以这么做。但是,shudowNow()也会终止队列中的所有作业,对吗?包括正在运行的任务,对吗?它返回队列中所有未开始执行的任务。它将试图通过中断线程来停止运行任务。如果设置了适当的超时,调用
shutdown()
可能就足够了。如果超时超过并且可能出现问题,那么您需要
shutdownNow()
。我知道它会返回未执行的任务,您是否建议,然后我将这些未使用的任务再次提交给执行者以使其工作?除非您希望
验证
作业表现不好,否则我根本不会使用
等待终止
。你已经关闭了该池,你可以在未来完成时继续打印电子邮件。问题是每个线程要执行的作业可能需要5分钟到1小时的时间。我不希望我的任何线程继续执行超过8分钟。你建议我做什么?