假设我有一个目录,我将在其中将多个传入文件放入该目录。我需要根据文件创建时间处理所有文件,即需要首先处理第一个创建的文件。
为了监视目录,我实现了WatchService API。
我们如何根据创建日期对目录中的文件进行排序?我们可以在这里实现多线程概念吗?
真的只是一个骨架,但它应该让你开始。它会编译,但它不会做任何事情。
当您看到一个新文件进来时,将其添加到队列的末尾。使用执行器服务创建的线程有 4 个线程等待处理文件。一旦其中一个进来,一个线程将拾取它并开始处理。如果它们都忙了,则下一个文件将不得不等待,但仍会按它们进来的顺序进行处理。
我不确定睡眠是否是个好主意。我想这取决于您收到文件的频率。
import java.io.File;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class FileWatcher //implements WatchService
{
private class FileProcessor implements Runnable
{
@Override
public void run()
{
while(!Thread.currentThread().isInterrupted())
{
try
{
File file = fileQueue.take(); // blocks
process(file);
}
catch (InterruptedException ex)
{
ex.printStackTrace();
}
// maybe sleep for a bit here (exponential backoff?)
}
}
private void process(File file)
{
// do some stuff
}
}
private static final int NUM_THREADS = 4;
private static final int QUEUE_SIZE = 1000;
private final BlockingQueue<File> fileQueue = new ArrayBlockingQueue<>(QUEUE_SIZE);
public FileWatcher()
{
// Create our 4 processors
ExecutorService executorService = Executors.newFixedThreadPool(NUM_THREADS);
for(int i = 0; i < NUM_THREADS; ++i)
{
executorService.execute(new FileProcessor());
}
}
// When a file comes in to your WatchService
private void onNewFile(File file)
{
fileQueue.add(file);
}
}