如何只终止在ExecutorService中超时的线程?

时间:2017-11-09 10:27:47

标签: java multithreading threadpool executorservice

我是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();

在awaitTermination循环中,我将TimeOut设置为3秒。我想在这里实现的,在这个超时时,我想终止所有已经活动至少3秒的线程。但我如何识别呢?

1 个答案:

答案 0 :(得分:0)

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

你给3秒的任务终止,如果任务还没有完成,那么除了试图强行停止正在运行的线程的shutdownNow()之外,你做不了多少。如果您认为任务需要超过三秒,请增加超时,但循环没有用。

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