Java 多线程文件轮询

Java 多线程文件轮询,java,multithreading,Java,Multithreading,我正在编写一个程序,该程序使用JNotify从磁盘中拾取文件,并将其加载到阻塞队列(比如newQueue)中。我有两个恶魔线程在while(true)循环中运行。一个线程使用take()继续查找新队列中存在的文件(JNotify在其中放置文件),并在收到后将其传递给ThreadPoolExecutor进行处理。 threadpoolexecutor维护工作线程集并执行命令。工作线程只需解析文件并将数据插入数据库。如果一切正常,状态将更新为成功,否则将更新为失败。 现在,这个线程将把文件放在另一个

我正在编写一个程序,该程序使用JNotify从磁盘中拾取文件,并将其加载到阻塞队列(比如newQueue)中。我有两个恶魔线程在while(true)循环中运行。一个线程使用take()继续查找新队列中存在的文件(JNotify在其中放置文件),并在收到后将其传递给ThreadPoolExecutor进行处理。 threadpoolexecutor维护工作线程集并执行命令。工作线程只需解析文件并将数据插入数据库。如果一切正常,状态将更新为成功,否则将更新为失败。 现在,这个线程将把文件放在另一个阻塞队列(比如moverQueue)上进行进一步处理

第二个demon线程使用take()继续池化这个移动器队列,一旦文件到达,就将其传递给自己的Threadpoolexecutor进行处理。根据状态,文件将移动到单独的位置。 现在,一旦工作完成,我将停止两个线程池,因此两个demon线程也将停止

这里的问题是我有一个重试逻辑,如果一些可恢复的处理失败,文件将再次放在新队列中,重试计数将增加

我找不到任何优雅的方式来决定我的工作是否已经完成,是否可以关闭线程池。我不能依靠文件计数,因为有些文件可能会失败。我的demon线程维护线程池,不知道重试,因为这是由工作线程处理的


请建议解决方案,如果这个设计方法是好的或不好。我有大量的文件,比如说40K文件一次就来了。

大概您已经有了一些简单的标志,可以知道文件何时停止进入您的程序,您只需要确保在关闭之前处理好程序中已经存在的文件

您可以通过在文件进入时将所有文件添加到集合“filesToHandle”中,并在工作线程成功处理该文件时删除该文件来实现这一点

从集合中删除文件时,如果标志为
true
,并且
filesToHandle
集合现在为空,则可以关闭执行器。类似地,如果将标志设置为true时,集合为空,则立即关闭执行器

确保同步这些操作以避免任何竞争条件


实际上,这与维护文件计数没有什么不同。我不知道你为什么认为那不是一个可行的选择。在某些地方,您的代码决定是否重试,这取决于处理是否成功。只需确保您只减少成功的计数

我已经为所有传入文件维护了一个队列,恶魔线程从那里获取文件并将其传递给工作线程。您是否建议保留另一组具有相同文件列表的文件?如果我的新队列在出现故障时变为空,我无法检查或终止执行器。我的工作线程正在将文件放回新队列,以便另一个工作线程可以处理该文件。队列变为空时,可能会出现这种情况,但工作线程仍在运行,并且在出现故障时可以将文件放回队列。队列为空并不表示工作已经完成