程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

Fork 和 Join 不使用主线程

发布于2021-06-12 09:27     阅读(127)     评论(0)     点赞(7)     收藏(5)


我想使用线程池来处理项目列表,然后等待它们完成。如果它们没有全部完成,我还需要能够在处理 4 分钟后超时。

这就是我目前所拥有的

ForkJoinPool threadPool = new ForkJoinPool(Runtime.getRuntime().availableProcessors() * 2);

list.forEach(entry -> threadPool.execute(() -> {
    // processing
}));

if (!threadPool.awaitQuiescence(4, TimeUnit.MINUTES)) {
    // send alert about delay
}

问题是有时这种方法会使用主线程来处理列表项之一,这意味着 awaitQuiescence 直到该列表项完成后才会启动。是否有任何其他线程池允许类似的东西但保证不使用主线程,或者有没有办法将 ForkJoinPool 配置为不使用?


解决方案


我认为问题在于您仍然list.forEach在主线程中迭代 ( )。使用并行流并将整个计算委托给您的池:

ForkJoinPool pool = new ForkJoinPool(Runtime.getRuntime().availableProcessors() * 2);

pool.execute(() -> {
    list.parallelStream().forEach(item -> {
        // processing
    });
});

if (!pool.awaitQuiescence(4L, TimeUnit.MINUTES)) {
    // send alert about delay
}

我建议阅读此问题(以及给出的答案)以了解如何使用ForkJoinPool并行流。



所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:http://www.javaheidong.com/blog/article/221777/311550d096ed11332493/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

7 0
收藏该文
已收藏

评论内容:(最多支持255个字符)