在我的Java微服务中,我正在重写onFileCreate((函数。此方法存在于内置的library=org.apache.mons.io.monitor,class=FileAlterationListenerAdaptor,method=void onFileCreate(最终文件(中。我注意到,即使创建了多个文件,也只有一个线程在侦听文件创建。这意味着它逐个(同步(处理文件,而不是同时处理多个文件。如何在这里实现多线程行为?
我不知道它是否相关,但我注意到这个内置库中定义的一些方法是"同步的"。我说的是class=FileAlterationMonitor,methods=setThreadFactory((,start((,stop((。这是原因吗?如果是,我需要覆盖所有这3种方法,还是其中一些方法?在此处输入图像描述
setThreadFactory
对您没有帮助,它只是创建监视文件系统的单个线程的一种替代方法。
你需要做的是
- 创建线程池,它将为新文件工作。通过这种方式,您可以控制并行处理的新文件数量(相信我,您不希望无限并发(
- 您的
FileAlterationListenerAdaptor.onFileCreate
不应该自己处理文件。相反,它应该将任务提交到线程池
粗略地说,代码应该是类似的东西
int numberOfThreads = ...;
ExecutorService pool = java.util.concurrent.Executors.newFixedThreadPool(numberOfThreads);
FileAlterationListenerAdaptor adaptor = new FileAlterationListenerAdaptor() {
public void onFileCreate(final File file) {
pool.submit(new Runnable() {
// here you do file processing
doSomethingWithFile(file);
});
}
}
....
FileAlterationObserver observer = new FileAlterationObserver(directory);
observer.addListener(adaptor);
...
FileAlterationMonitor monitor = new FileAlterationMonitor(interval);
monitor.addObserver(observer);
monitor.start();