我有一个Java应用程序,它遍历树状文件夹结构并最终删除整个文件夹结构。为此,我将Blocking Queue与一个生产者一起使用(遍历一棵树,并放置需要删除的文件的路径),以及许多实际执行删除作业的消费者。

文件夹必须为空才能删除,因此,请考虑采用以下结构:

/folder1/file1
/folder1/file2
/folder1/file3
/folder1/

这是BlockingQueue在任何给定点可能包含的内容。考虑到有4个使用者轮询队列:

Consumer1将选择并删除/folder1/file1
Consumer2将提取并删除/folder1/file2
Consumer3将提取并删除/folder1/file3
Consumer4将提取并删除/folder1
如果Consumer3尚未完成删除/folder1/file3,那么Consumer4将无法删除/folder1/,因为它将被标记为非空。

使用者线程是否有办法等待其他使用者线程完成某些任务?

最佳答案

有很多解决业务问题的方法。

方法1:您的问题是消费者4实际上进入Folder时,它需要等待所有文件的删除。我认为,如果Consumer 4可以访问folder1,则不必这样做。它可以只是转到文件夹(操作系统路径)并检查其是否为空。如果为空,则删除它,然后等待。

方法2:生产者线程可以做更多的工作。如果发现需要删除folder1中的所有文件。它不必先放置所有文件名,然后再放置文件夹名。它应该只放置文件夹名称。只有一个使用者线程将获得文件夹名称并将其删除。

关于java - 等待消费者完成任务,然后其他人才能开始,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42908964/

10-09 00:21