package com.demo.main;
import java.io.File;
import java.util.LinkedList;
import java.util.List;
import java.util.Vector;
public class FolderFileFinder {
private MyRunnable myRunnable;
// public static void main(String[] args) {
// long currentTimeMillis = System.currentTimeMillis();
// extracted();
// long currentTimeMillis2 = System.currentTimeMillis();
// System.out.println(currentTimeMillis2 - currentTimeMillis);
//
// }
public FolderFileFinder(String dirtory) {
myRunnable = new MyRunnable();
myRunnable.file = new File(dirtory);
Thread thread = new Thread(myRunnable);
thread.start();
}
public List<String> getFilesList() {
List<String> filepath = myRunnable.getFilepath();
// System.out.println(filepath.size());
return filepath;
}
private static void extracted() {
MyRunnable myRunnable = new MyRunnable();
myRunnable.file = new File("D:\\123");
Thread thread = new Thread(myRunnable);
thread.start();
List<String> filepath = myRunnable.getFilepath();
System.out.println(filepath.size());
}
}
class MyRunnable implements Runnable {
// private static List<String> filepath = new LinkedList<>();
private static List<String> filepath = new Vector<>();
private static List<Thread> threads = new LinkedList<Thread>();
private static volatile int icnt = 1; // icnt是从1开始的,因为还有主线程创建的线程
private static Object waitLock = new Object();
private static Object threadLock = new Object();
private static volatile int waitCnt = 0;
private static Object l1 = new Object();
private static Object l2 = new Object();
public File file;
public List<String> getFilepath() {
while (icnt > 0) {
System.out.println(icnt + " --- " + filepath.size());
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return filepath;
}
private void FindFile(File file) {
File[] fs = file.listFiles();
if (fs != null) {
for (File f : fs) {
if (f.isDirectory()) {
if (icnt >= 150) {
try {
synchronized (waitLock) {
waitCnt++;
waitLock.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
MyRunnable newRunner = new MyRunnable();
newRunner.file = f;
Thread thread = new Thread(newRunner);
synchronized (threadLock) {
threads.add(thread);
icnt++;
}
thread.start();
} else if (f.isFile()) {
// synchronized (fileLock) {
filepath.add(f.toString());
// }
}
}
}
}
@Override
public void run() {
FindFile(file);
synchronized (threadLock) {
icnt--;
}
synchronized (waitLock) {
if (waitCnt > 0) {
// System.out.println(icnt);
// waitLock.notifyAll();
waitLock.notify();
waitCnt --;
}
}
}
}
调用逻辑
package com.demo.main;
import java.util.List;
public class MyEntry {
public static void main(String[] args) {
FolderFileFinder folderFileFinder = new FolderFileFinder("D:\\123");
List<String> filesList = folderFileFinder.getFilesList();
System.out.println(filesList.size());
}
}