Можем ли мы использовать концепцию многопоточности вместе с WatchService API в Java?
Предположим, у меня есть каталог, в котором я получу несколько входящих файлов в этот каталог. Мне нужно обработать все файлы в зависимости от времени создания файла, т.е. сначала нужно обработать первый созданный файл.
Для просмотра каталога я реализовал WatchService API.
Как мы можем отсортировать файлы в каталоге на основе созданной даты? И можем ли мы реализовать концепцию многопоточности здесь?
1 ответ
Просто скелет, но он должен начать. Он скомпилируется, но ничего не будет делать.
Когда вы увидите новый файл, добавьте его в конец очереди. Существует 4 потока, созданные с помощью службы executor, ожидающей обработки файлов. Как только один из них приходит, один поток его забирает и начинает обработку. Если они все заняты, следующие файлы должны будут ждать, но все равно будут обрабатываться в порядке поступления.
Я не уверен, является ли сон хорошей идеей или нет. Я полагаю, это зависит от того, как часто вам будут приходить файлы.
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);
}
}