具有优先级队列的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 (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...