Просто скелет действительно, но он должен начать работу. Он будет компилироваться, но ничего не сделает.
Когда вы видите новый файл, добавьте его в конец очереди. Существует 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);
}
}
Многопоточность, безусловно, возможна. Скажем, что 'File1' создается, а затем вскоре после' File2', вас беспокоит, завершает ли 'File2' обработку перед' File1'? (возможно, 'File2' намного меньше или что-то еще) – Michael
Нет, мне не важно время обработки File2. Можете ли вы, пожалуйста, изменить пример кода здесь. – dev777