2017-01-23 5 views
1

Предположим, у меня есть каталог, в котором я получаю несколько входящих файлов в этот каталог. Мне нужно обработать все файлы на основе созданного файла. I.e сначала сначала нужно обработать сначала созданный файл.Можем ли мы использовать концепцию многопоточности вместе с API WatchService в java?

Чтобы посмотреть каталог, я применил API WatchService.

Как мы можем сортировать файлы в каталоге на основе созданной даты? И можно ли здесь реализовать концепцию многопоточности?

+0

Многопоточность, безусловно, возможна. Скажем, что 'File1' создается, а затем вскоре после' File2', вас беспокоит, завершает ли 'File2' обработку перед' File1'? (возможно, 'File2' намного меньше или что-то еще) – Michael

+0

Нет, мне не важно время обработки File2. Можете ли вы, пожалуйста, изменить пример кода здесь. – dev777

ответ

0

Просто скелет действительно, но он должен начать работу. Он будет компилироваться, но ничего не сделает.

Когда вы видите новый файл, добавьте его в конец очереди. Существует 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); 
    } 
}