如何在Java中实现多线程池

时间:2011-02-25 04:10:00

标签: java multithreading file threadpool

我有一个使用线程的场景。

首先,我有一个文件夹,其中有文件经常更新。 所以,我编写了一个线程,它读取文件夹的内容并将文件名写入静态列表,并在新文件进入时更新列表。

其次,我写了另一个线程,它从列表中获取文件名并对文件进行一些处理。

这两个线程连续运行,一个检查新文件,一个处理新文件。

现在我需要一次处理三个文件并运行三个线程。当一个线程完成处理时,另一个线程从列表中获取另一个文件名并启动该过程。

所以我需要一些机制来拥有三个线程并检查它们是否存活,并相应地启动一个新线程,文件列表也会经常更新。

我也调查了ExecutorService,但是当列表更新时,我无法提供更新列表。

谢谢, 和Sandeep

4 个答案:

答案 0 :(得分: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); } } );
          }
        }
      });

假设您的处理器可以跟上轮询器,这样就可以了,否则您需要在提交给执行程序之前加入一些限制机制。

答案 1 :(得分:0)

不要使用列表;而是使用java.util.concurrent.ThreadPoolExecutor,只需将表示要处理的文件的Runnable删除到执行程序中,而不是将它们放入全局列表中。

答案 2 :(得分: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();

答案 3 :(得分:0)

如果通知更改正在为您提供文件夹中的更改列表,那么如何观察文件夹中的更改并生成线程/文件呢?