[英]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.