【发布时间】:2017-03-22 01:53:41
【问题描述】:
我有一个 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/,因为它将被标记为非空。
有没有办法让消费者线程等待其他消费者线程完成某些任务?
【问题讨论】:
-
您可以为每个文件夹使用CountDownLatch,它将使用文件夹中包含的文件数进行初始化。
BlockingQueue将包含一个元组(file, countDownLatch)。如果File是文件,一旦删除,消费者调用countDown(),如果File是文件夹,消费者调用await()然后删除文件夹。 -
这是您的真实用例还是类比?
-
@NicolasLabrot 这是一个真实的案例。每个文件夹可以包含数十万(如果不是数百万)文件/子文件夹
-
@AdrianDanielCulea 由于您使用的是树,因此请专注于删除树的叶子。
-
出于好奇,您是否有任何证据支持 N 个线程能够比一个线程更快地删除文件和文件夹的想法?您的计算机可能有多个 CPU,但您的硬盘驱动器可能只有一个接口。
标签: java multithreading producer-consumer blockingqueue