2011-02-25 71 views
3

我有一個使用線程的場景。如何在Java中實現多線程池

首先,我有一個文件夾,其中有經常更新的文件。 因此,我寫了一個線程,讀取文件夾的內容,並將文件名寫入靜態列表,並在新文件進入時更新列表。

其次我寫了另一個線程,它從列表中獲取文件名並用這些文件做一些處理。

這兩個線程連續運行,一個檢查新文件,一個處理新文件。

現在我需要在運行三個線程的同時處理三個文件。當一個線程完成處理時,另一個線程從列表中獲取另一個文件名並啓動該進程。

所以我需要一些機制,有三個線程,並檢查它們是否存活,並相應地啓動一個新的線程和文件列表也經常更新。

我也看着ExecutorService,但雖然列表得到更新,我無法提供它的更新列表。

感謝, 桑迪普

+0

不是很清楚,恐怕。爲什麼是三個,而不是一個任意數字?爲什麼要檢查線程以查看它們是否還活着? – 2011-02-25 04:38:18

+0

我的意思是添加 - 它聽起來像使用的自然數據結構是一個隊列(http://download.oracle.com/javase/6/docs/api/java/util/Queue.html)。爲了利用這一點,您可以讓消費者線程從隊列中讀取數據,並在成功從中取出項目時進行工作。 – 2011-02-25 04:39:57

回答

2

建立在現有的答案,你的代碼看起來是這樣的:

final ExecutorService executor = Executors.newFixedThreadPool(2); 

    final FilePoller poller = ... 
    final FileProcessor processor = ... 

    new Thread(new Runnable() 
     { 
     @Override 
     public void run() 
     { 
      while (true) 
      { 
      final File file = poller.pollForFile(); 
      executor.submit(new Runnable() { public void run() { processor.processFile(file); } }); 
      } 
     } 
     }); 

假設你的處理器能夠跟上輪詢,這將是罰款,否則你會希望把一些限制機制之前提交給執行人。

+0

謝謝.. 我的問題解決.... – Sandeep 2011-02-25 11:08:20

0

不要使用名單;而是使用java.util.concurrent.ThreadPoolExecutor,並將Runnable的代表將要處理的文件放入執行程序,而不是將它們放入您的全局列表中。

0

與@SimonC的建議類似,但不是一個很長的評論,我有一個答案。

final FilePoller poller = ... 
final FileProcessor processor = ... 

final ExecutorService executor = Executors.newFixedThreadPool(4); 

executor.submit(new Runnable() { 
    public void run() { 
     final File file = poller.pollForFile(); 
     executor.submit(new Runnable() { public void run() { processor.processFile(file); } }); 
     // repeat, but wait for a free thread. 
     executor.submit(this); 
    } 
    }); 
// to stop the whole thing 
executor.shutdown(); 
0

如何看待文件夾中的更改並生成線程/文件,假設通知更改爲您提供文件夾中的更改列表?