Java e4 ESelectionService setSelection上的ConcurrentModificationException

Java e4 ESelectionService setSelection上的ConcurrentModificationException,java,eclipse-rcp,e4,concurrentmodification,Java,Eclipse Rcp,E4,Concurrentmodification,我有一个代码,当用户在树中选择某个内容时,设置ESelectionService的活动选择。就像这里: treeViewer.addSelectionChangedListener(new SelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { if (selectionService != null) {

我有一个代码,当用户在树中选择某个内容时,设置ESelectionService的活动选择。就像这里:

treeViewer.addSelectionChangedListener(new SelectionChangedListener() {
    @Override
    public void selectionChanged(SelectionChangedEvent event) {
        if (selectionService != null) {
             selectionService.setSelection(((IStructuredSelection) event.getSelection()).getFirstElement());
        }
    }
});
正在注入selectionService的位置。到目前为止还不错

我还有一些命令处理程序,它们有自己的canExecute方法。在这些方法中,我检查当前也被注入的选择,并决定canExecute方法是否应该返回true或false。在这个方法中,我还可以更改相应HandledToolItem的可见性,如下所示

现在我所经历的是,有时候调用ESelectionService的setSelection方法会抛出ConcurrentModificationException。这实际上是在访问itemsToCheck ArrayList时发生的

我的方法容易出错,还是这只是4.4中的一个bug

以下是stacktrace:

Exception occurred
java.util.ConcurrentModificationException
        at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
        at java.util.ArrayList$Itr.next(Unknown Source)
        at org.eclipse.e4.ui.workbench.renderers.swt.ToolItemUpdater.updateContributionItems(ToolItemUpdater.java:36)
        at org.eclipse.e4.ui.workbench.renderers.swt.ToolBarManagerRenderer$8.changed(ToolBarManagerRenderer.java:367)
        at org.eclipse.e4.core.internal.contexts.TrackableComputationExt.update(TrackableComputationExt.java:110)
        at org.eclipse.e4.core.internal.contexts.EclipseContext.processScheduled(EclipseContext.java:338)
        at org.eclipse.e4.core.internal.contexts.EclipseContext.set(EclipseContext.java:352)
        at org.eclipse.e4.ui.internal.workbench.swt.E4Application$4.changed(E4Application.java:842)
        at org.eclipse.e4.core.internal.contexts.TrackableComputationExt.update(TrackableComputationExt.java:110)
        at org.eclipse.e4.core.internal.contexts.EclipseContext.processScheduled(EclipseContext.java:338)
        at org.eclipse.e4.core.internal.contexts.EclipseContext.set(EclipseContext.java:352)
        at org.eclipse.e4.ui.internal.workbench.SelectionAggregator$7.changed(SelectionAggregator.java:228)
        at org.eclipse.e4.core.internal.contexts.TrackableComputationExt.update(TrackableComputationExt.java:110)
        at org.eclipse.e4.core.internal.contexts.EclipseContext.processScheduled(EclipseContext.java:338)
        at org.eclipse.e4.core.internal.contexts.EclipseContext.set(EclipseContext.java:352)
        at org.eclipse.e4.ui.internal.workbench.SelectionServiceImpl.setSelection(SelectionServiceImpl.java:31)
        at com.e4test.parts.SamplePart$TreeViewerSelectionListener.selectionChanged(SamplePart.java:116)

可能会出现异常的堆栈跟踪help@greg-449我用stack trace attachedLooks编辑了post-now,就像您在ToolItemUpdater中迭代该列表时设法更改“要检查的项目”列表一样。可能在您的“HandledToolItem”“canExecute”方法中—向我们展示该代码。是的,这也是我的想法。我的canExecute方法只检查选择的类型simple instanceof check,然后调用setToolItemVisible方法——正如我在问题中指出的那样。因此,实际上是setToolItemVisible方法造成了问题-编辑仍由ToolItemUpdater引用的项您在setToolItemVisible中保留了Display.asyncExec调用吗?这看起来像是试图将集合延迟到循环完成后才可见。