多线程文件轮询

时间:2012-02-05 07:17:08

标签: java multithreading

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

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

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

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

如果这种设计方法没有问题,请提出解决方案。我有大量的文件说一下就会有40K。

1 个答案:

答案 0 :(得分:0)

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

您可以通过将所有文件添加到“filesToHandle”集合中来执行此操作,并在工作线程成功处理文件时删除该文件。

当您从集合中删除文件时,如果标志为true且您的filesToHandle集合现在为空,则可以关闭执行程序。同样,如果将标志设置为true,则该组为空,请立即关闭执行程序。

请务必同步这些操作以避免任何竞争条件。

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