簡體   English   中英

如何在Java中實現多線程池

[英]How to implement a multithreaded pool in Java

我有一個使用線程的場景。

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

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

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

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

所以我需要一些機制來擁有三個線程並檢查它們是否存活,因此啟動一個新線程,文件列表也經常更新。

我也查看了ExecutorService但是當列表得到更新時,我無法提供更新列表。

謝謝,Sandeep

在現有答案的基礎上,您的代碼將類似於:

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

假設您的處理器可以跟上輪詢器,這樣就可以了,否則您需要在提交給執行程序之前加入一些限制機制。

不要使用清單; 而是使用java.util.concurrent.ThreadPoolExecutor,只需將表示要處理的文件的Runnable刪除到執行程序中,而不是將它們放入全局列表中。

類似於@ 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();

如何觀察文件夾中的更改並生成線程/文件,假設通知更改為您提供了文件夾中的更改列表?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM