【问题标题】:Multithreaded File polling多线程文件轮询
【发布时间】:2012-02-27 04:34:25
【问题描述】:

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

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

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

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

如果这种设计方法好不好,请提出解决方案。我有大量文件说 40K 一次。

【问题讨论】:

    标签: java multithreading


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 我已经为所有传入文件维护了一个队列,恶魔线程从那里获取文件并将其传递给工作线程。您是否建议保留另一个具有相同文件列表的集合?如果我的新队列为空,我将无法检查或终止执行程序,因为失败时我的工作线程正在将文件放回新队列,以便另一个工作线程可以处理它。当队列变空但工作线程时会有机会线程仍在运行,并且可以在失败的情况下将文件放回队列中。队列为空不反映工作已完成
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-10
    • 1970-01-01
    • 2020-06-14
    • 2014-12-08
    • 2013-12-14
    • 1970-01-01
    • 2019-02-17
    相关资源
    最近更新 更多