微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

具有优先级队列的Java Fork / Join Pool?

如何解决具有优先级队列的Java Fork / Join Pool?

我需要处理许多PDF文件。因此,我有一个文件列表(某些文件夹或zip文件中的文件)。我需要每个PDF的子任务。然后,我每页创建一个子任务,以便可以对其进行处理。

我当时在考虑使用fork / join池,但是那样只会不断创建更多子任务来读取更多文件,而我的内存不足。
有时我会收到很多小文件,有时会得到有很多页面的大文件。当已经有很多页面要排队处理时,加载更多文档毫无意义。

  1. 读取文件夹中的每个pdf文件,并创建,分叉和联接子任务(2)。
  2. 为每个页面创建,分叉和合并一个子任务(3)。
  3. 处理此页面

ForkJoinTask.helpQuiesce(),在某些情况下可能足够了。创建一些子任务后,我只能调用ForkJoinTask.helpQuiesce()。这样子任务更有可能在加载更多数据之前得到处理。

但是我找不到设置子任务优先级的任何东西。那会容易得多吗?如果我正确理解文档,则每个工作线程有一个提交队列,然后一个任务队列。有没有办法控制先处理提交队列中的哪些任务?我可以为工作线程传递一个工厂,但不能为提交队列传递一个工厂。

就像在“分而治之”的比喻中一样:在入侵一个新国家甚至一个新大陆之前,掠夺所有城市可能更有意义,这样您就可以获得执行这些任务所需的足够资源。但是如何控制呢?

我知道Fork / Join使用工作偷窃,您通常不必费心。但是我需要构建一个批处理工具,我不能让它甚至在开始处理任何页面之前就将千兆字节的数据加载到内存中。但我不需要一堆类似hadoop的框架来处理一堆pdf文件。那太过分了。

我可以使用PriorityQueue<E>,但这似乎要花很多功夫,因为这只是一个简单的数据结构,而Fork / Join是一个框架。

是否没有办法控制任务的处理顺序?我想念什么?在Java中是否还有其他基于优先级队列的解决方案?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。