2017-01-23 76 views
1

假設我有一個目錄,其中我將多個傳入文件放入該目錄。我需要根據創建的文件時間處理所有文件,即首先創建的文件需要先處理。我們可以在java中使用多線程概念和WatchService API嗎?

爲了觀看目錄,我實現了WatchService API。

我們如何根據創建的日期對目錄中的文件進行排序?我們可以在這裏實現多線程概念嗎?

+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); 
    } 
}