java - 完成服务 : how to kill all threads and return result through 5 seconds?

标签 java multithreading concurrency

CompletionService 有问题。 我的任务:并行解析大约 300 个 html 页面,我只需要等待所有结果 5 秒,然后 - 将结果返回给主代码。 我决定为此使用 CompletionService + Callable。 问题是如何停止由 CompletionService 引起的所有线程并从成功解析的页面返回结果?在这段代码中删除了打印行,但我可以说 5 秒就足够了(有很好的结果,但是当所有线程完成时程序等待)。我的代码执行了大约 2 分钟。

我的调用代码:

Collection<Callable<HCard>> solvers = new ArrayList<Callable<HCard>>();
for (final String currentUrl : allUrls) {
    solvers.add(new Callable<HCard>() {
        public HCard call() throws ParserException {
            HCard hCard = HCardParser.parseOne(currentUrl);                      
            if (hCard != null) {
                return hCard;
            } else {
                return null;
            }
        }
    });
}
ExecutorService execService = Executors.newCachedThreadPool();
Helper helper = new Helper();
List<HCard> result = helper.solve(execService, solvers);
//then i do smth with result list

我调用的代码:

public class Helper {
List<HCard> solve(Executor e, Collection<Callable<HCard>> solvers) throws InterruptedException {
    CompletionService<HCard> cs = new ExecutorCompletionService<HCard>(e);
    int n = solvers.size();

    Future<HCard> future = null;
    HCard hCard = null;
    ArrayList<HCard> result = new ArrayList<HCard>();

    for (Callable<HCard> s : solvers) {
        cs.submit(s);
    }
    for (int i = 0; i < n; ++i) {
        try {
            future = cs.take();
            hCard = future.get();
            if (hCard != null) {
                result.add(hCard);
            }
        } catch (ExecutionException e1) {
            future.cancel(true);
        }
    }
    return result;
}

我尝试使用:

  • awaitTermination(5000, TimeUnit.MILLISECONDS)
  • future .取消(真)
  • execService.shutdownNow()
  • future.get(5000, TimeUnit.MILLISECONDS);
  • TimeOutException:我无法获取 TimeOutException。

请帮助我了解我的代码的上下文。
提前致谢!

最佳答案

您需要确保您提交的任务能够正确响应中断,即它们会检查 Thread.isInterrupted() 或被视为“可中断”。

我不确定您是否需要为此提供完成服务。

ExecutorService service = ...

// Submit all your tasks
for (Task t : tasks) {
    service.submit(t);
}

service.shutdown();

// Wait for termination
boolean success = service.awaitTermination(5, TimeUnit.SECONDS);
if (!success) {
    // awaitTermination timed out, interrupt everyone
    service.shutdownNow();
}

此时,如果您的 Task 对象不响应中断,您将无能为力

关于java - 完成服务 : how to kill all threads and return result through 5 seconds?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1096995/

相关文章:

java - (设计思路)唤醒多进程做工作流的最佳实践

java - 如何反向绘制数组

java - 安卓工作室 : Espresso dependencies in gradle

java - 如何像守护线程一样启动Java主线程?

java - LinkedBlockingQueue 使用非线程安全列表

java - 与并发共享变量

java - 我正在制作动画的这个正方形在它后面留下了痕迹,任何人都可以找出原因吗?

c# - 多线程批处理队列

.net - 面试时如何练习大型SQL Server索引或分区问题?

python - 异步等待方法在 Python 3 中完成