等待外部线程启动
Wait for external Thread to start
我使用 Apache 中的 FileAlterationMonitor
,我想知道它何时完成初始化。我叫
fileAlterationMonitor.start();
在 fileAlterationMonitor
完成初始化之前,它启动了一个新线程并且我的程序继续运行。我想等待初始化完成,但我找不到检查何时完成的方法。
我可以睡一会儿,但要等多久取决于电脑的速度。
我查看了 CountDownLatch
,这在我自己的代码中看起来很简单,但我如何在 FileAlterationMonitor
上使用它?它不能扩展它,因为它是最终的。
有没有比等待更好的解决方案"long enough"?
您可以使用 CountDownLatch
并添加 FileAlterationObserver
,这会将 #initialize()
上的闩锁计算到 observers
的尾部。
这可能会像下面这样实现:
{
FileAlterationMonitor monitor = new FileAlterationMonitor();
Iterator<FileAlterationObserver> iterator = monitor.getObservers().iterator();
FileAlterationObserver last = null;
while (iterator.hasNext()) {
last = iterator.next();
}
final CountDownLatch cdl = new CountDownLatch(1);
monitor.removeObserver(last);
monitor.addObserver(new FileAlterationObserver(last.getDirectory(), last.getFileFilter()) {
@Override
public void initialize() throws Exception {
super.initialize();
cdl.countDown();
}
});
try {
// wait until last observer would be initialized
monitor.start();
cdl.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
我使用 Apache 中的 FileAlterationMonitor
,我想知道它何时完成初始化。我叫
fileAlterationMonitor.start();
在 fileAlterationMonitor
完成初始化之前,它启动了一个新线程并且我的程序继续运行。我想等待初始化完成,但我找不到检查何时完成的方法。
我可以睡一会儿,但要等多久取决于电脑的速度。
我查看了 CountDownLatch
,这在我自己的代码中看起来很简单,但我如何在 FileAlterationMonitor
上使用它?它不能扩展它,因为它是最终的。
有没有比等待更好的解决方案"long enough"?
您可以使用 CountDownLatch
并添加 FileAlterationObserver
,这会将 #initialize()
上的闩锁计算到 observers
的尾部。
这可能会像下面这样实现:
{
FileAlterationMonitor monitor = new FileAlterationMonitor();
Iterator<FileAlterationObserver> iterator = monitor.getObservers().iterator();
FileAlterationObserver last = null;
while (iterator.hasNext()) {
last = iterator.next();
}
final CountDownLatch cdl = new CountDownLatch(1);
monitor.removeObserver(last);
monitor.addObserver(new FileAlterationObserver(last.getDirectory(), last.getFileFilter()) {
@Override
public void initialize() throws Exception {
super.initialize();
cdl.countDown();
}
});
try {
// wait until last observer would be initialized
monitor.start();
cdl.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}