繁体   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