2

我正在寻找一个阻止版本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] 如何捕捉启动终止的事件有一些共同点?但它已经很老了,我在这里提供了有关我的调查的更多信息。

4

2 回答 2

2

您可以使用DebugPlugin.getDefault().addDebugEventFilter(filter)来设置IDebugEventFilter课程。

这是因为所有调试/运行事件都包括DebugEvent.TERMINATE启动终止时的事件。

于 2015-11-30T12:46:28.090 回答
1

我还找到了另一种使用启动管理器的方法。我只需要使用另一个侦听器接口:

final ILaunchManager launchMan = DebugPlugin.getDefault().getLaunchManager();
launchMan.addLaunchListener(new ILaunchesListener2()
{
    public void launchesTerminated(ILaunch[] launches)
    {
        for (ILaunch launch : launches) {
            ILaunchConfiguration conf = launch.getLaunchConfiguration();
            if (("Executing install in "+proj.getLocation().toOSString().replace('\\', '-')).equals(conf.getName()))
            {
                //my maven launch is terminated!
            }
        }
    }
});
于 2015-11-30T12:58:41.243 回答