我正在寻找一个阻止版本AtomicReference
来避免这种主动等待:
AtomicReference<Object> ref = new AtomicReference<Object>();
// execute some code in a different thread and set the reference
Object o;
while ((o = ref.get()) == null);
// continue execution
Java 提供了一个Future
接口,它阻塞了get()
方法。但是我不能使用concurrent
包的那一部分,因为引用应该由一个框架设置,在这个框架中需要使用一个简单的侦听器。
更准确地说,我使用 Eclipse 中的启动框架。我通过启动 maven 启动,org.eclipse.m2e.actions.ExecutePomAction
但我无法直接访问它的进程,因为它深深隐藏在 JDT 中。这就是为什么我为此目的使用 Eclipse 的启动管理器:
final ILaunchManager launchMan = DebugPlugin.getDefault().getLaunchManager();
launchMan.addLaunchListener(new ILaunchListener() {
public void launchRemoved(ILaunch launch) {
ILaunchConfiguration conf = launch.getLaunchConfiguration();
if (("Executing install in "+proj.getLocation().toOSString().replace('\\', '-')).equals(conf.getName()))
{
IProcess[] processes = launch.getProcesses();
if (processes.length == 1)
procRef.set(processes[0]);
}
launchMan.removeLaunchListener(this);
}
});
我认为没有其他方法可以在之后使用主动等待,因为 IProcess 没有提供监听其终止的可能性。有点像这样:
BusyIndicator.showWhile(Display.getCurrent(), new Runnable() {
public void run() {
while (!proc.isTerminated())
Thread.sleep(500);
}
});
这个问题基本上与[eclipse pde] 如何捕捉启动终止的事件有一些共同点?但它已经很老了,我在这里提供了有关我的调查的更多信息。