Можем ли мы использовать концепцию многопоточности вместе с 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);
    }
}
Другие вопросы по тегам