我有一个使用线程的场景。
首先,我有一个文件夹,其中有文件经常更新。 所以,我编写了一个线程,它读取文件夹的内容并将文件名写入静态列表,并在新文件进入时更新列表。
其次,我写了另一个线程,它从列表中获取文件名并对文件进行一些处理。
这两个线程连续运行,一个检查新文件,一个处理新文件。
现在我需要一次处理三个文件并运行三个线程。当一个线程完成处理时,另一个线程从列表中获取另一个文件名并启动该过程。
所以我需要一些机制来拥有三个线程并检查它们是否存活,并相应地启动一个新线程,文件列表也会经常更新。
我也调查了ExecutorService
,但是当列表更新时,我无法提供更新列表。
谢谢, 和Sandeep
答案 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)
如果通知更改正在为您提供文件夹中的更改列表,那么如何观察文件夹中的更改并生成线程/文件呢?