2011-02-25 77 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

如何看待文件夹中的更改并生成线程/文件,假设通知更改为您提供文件夹中的更改列表?