【发布时间】:2012-02-27 04:34:25
【问题描述】:
我正在编写一个程序,它使用 JNotify 从磁盘中选择文件并将其加载到阻塞队列(比如 newQueue)中。我有两个恶魔线程在 while(true) 循环中运行。一个线程使用 take() 继续寻找存在于新队列(JNotify 放置文件的位置)中的文件,并在收到后将其传递给 ThreadPoolExecutor 进行处理。 threadpoolexecutor 维护一组工作线程并执行命令。工作线程只需解析文件并将数据插入数据库。如果一切正常,则状态将更新为成功,否则将更新为失败。 现在这个线程会将文件放到另一个阻塞队列(比如 moverQueue)中进行进一步处理。
第二个恶魔线程使用 take() 继续池化这个移动队列,一旦文件到达,将它传递给它自己的 Threadpoolexecutor 进行处理。根据状态,文件将被移动到单独的位置。 现在一旦工作完成,我将停止两个线程池,因此两个恶魔线程也将停止。
这里的问题是我有一个重试逻辑,如果某些可恢复的处理失败,文件会再次放入新队列,重试计数会增加。
我找不到任何优雅的方法来确定我的工作是否已完成以及是否可以关闭线程池。我不能依赖文件计数,因为某些文件可能会失败。我的恶魔线程维护线程池并且不知道重试,因为这是由工作线程处理的。
如果这种设计方法好不好,请提出解决方案。我有大量文件说 40K 一次。
【问题讨论】:
标签: java multithreading