package me.snowiest.file;
import java.io.File;
import java.io.Serializable;
import java.util.*;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class FileIterator extends Thread implements Serializable {
private List<File> files;
private Queue<File> directories;
private final Lock lock = new ReentrantLock(); //共同持有的锁对象
long startTime = System.currentTimeMillis(); //统计代码运行时长
public FileIterator() {
this(new ArrayList<>(), new LinkedList<>());
}
public FileIterator(List<File> files) {
this(files, new LinkedList<>());
}
public FileIterator(Queue<File> directories) {
this(new ArrayList<>(), directories);
}
public FileIterator(List<File> files, Queue<File> directories) {
setFiles(files);
setDirectories(directories);
}
public List<File> getFiles() {
return files;
}
public void setFiles(List<File> files) {
this.files = Objects.requireNonNull(files);
}
public Queue<File> getDirectories() {
return directories;
}
public void setDirectories(Queue<File> directories) {
this.directories = Objects.requireNonNull(directories);
}
@Override
public void run() {
long stamp = System.currentTimeMillis();
boolean isStamped = true;
while (true) {
lock.lock();
//获取队列中第一个元素
File directory = this.directories.poll();
if (!isStamped) {
stamp = System.currentTimeMillis();
isStamped = true;
}
lock.unlock();
if (directory == null) {
//10ms内还未遍历到新的目录,则认为遍历完毕
if (System.currentTimeMillis() - stamp >= 10) {
System.out.println("文件数:" + this.files.size() + "(" + (System.currentTimeMillis() - startTime) + "ms)");
break;
} else {
continue;
}
}
isStamped = false;
//得到目录中所有的文件
File[] files = directory.listFiles();
if (files == null || files.length == 0) {
continue;
}
for (File file : files) {
//将目录中的目录加入队列,文件则保存在集合中
if (file.isDirectory()) {
lock.lock();
this.directories.offer(file);
lock.unlock();
} else {
lock.lock();
this.files.add(file);
lock.unlock();
}
}
}
}
public static void main(String[] args) {
Queue<File> linkedList = new LinkedList<>();
linkedList.add(new File("D:\\Program Files"));
FileIterator fileIterator = new FileIterator(linkedList);
Thread thread1 = new Thread(fileIterator);
Thread thread2 = new Thread(fileIterator);
Thread thread3 = new Thread(fileIterator);
Thread thread4 = new Thread(fileIterator);
Thread thread5 = new Thread(fileIterator);
thread1.start();
thread2.start();
thread3.start();
thread4.start();
thread5.start();
}
}
[JAVA]多线程遍历文件夹(非递归方式)
最新推荐文章于 2023-06-26 14:59:27 发布