java - 如何使用 IWorkspaceRunnable 安排或加入一组更改?

标签 java eclipse multithreading eclipse-plugin

背景

我正在通过 Eclipse PDE 开发一个插件,我在创建标记时遇到了生成太多 ResourceChangeEvents 的问题(每次调用 setAttribute(..) 和 file.createMarker(. .), 所以我想将所有代码缩减为单个更改事件)。因此,我尝试使用 IWorkspaceRunnable 对工作区的一组更改进行批处理。

问题

我想等到 workspace.run(..) 完成后再返回我的变量“MarkerField.marker_”(否则我会返回“null”)。例如,如果我使用 Eclipse 的作业管理器,我可以使用 Job.join() 让我的调用线程等待作业完成。那么,有没有办法让调用线程等待 workspace.run(..) 完成?

// Generates and returns a marker given absolute position
public static IMarker generateMarker(final IFile file, final String message, final        String markerType,
                                     final int severity, final int priority, final int start,
                                     final int end) 
throws CoreException, BadLocationException,
    IOException
{
    // Setting up "line" for marker generation.
    final int line = ResourceUtility.convertToDocument(file).getLineOfOffset(start);

    IWorkspace workspace = ResourceUtility.getWorkspace();

    IWorkspaceRunnable operation = new IWorkspaceRunnable()
    {

        public void run(IProgressMonitor monitor) throws CoreException
        {
            // Marker generation code...
            IMarker marker = file.createMarker(markerType);

            marker.setAttribute(IMarker.MESSAGE, message);
            marker.setAttribute(IMarker.PRIORITY, priority);
            marker.setAttribute(IMarker.LINE_NUMBER, line + 1);
            marker.setAttribute(IMarker.CHAR_START, start);
            marker.setAttribute(IMarker.CHAR_END, end);
            marker.setAttribute(IMarker.SEVERITY, severity);

            MarkerField.marker_ = marker;
        }
    };
    workspace.run(operation, null);

    // Check/wait until the thread is finished.
    return MarkerField.marker_; //I want to ensure this is non-null!
}

// Wrapper class to return marker instance in generate marker methods
// Effectively works as a pointer to a pointer
static class MarkerField 
{
    @SuppressWarnings("null") public static IMarker marker_;
}

最佳答案

org.eclipse.core.resources.WorkspaceJobJob 的特殊版本,它包含工作区调用以减少资源更改事件的数量。为此,您覆盖 runInWorkspace 方法而不是正常的 run

如果你使用它,你可以使用 join(另请参阅 JobManager.join,它允许你等待一系列作业并有一个进度监视器)。

关于java - 如何使用 IWorkspaceRunnable 安排或加入一组更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18751551/

相关文章:

java - 安卓 : Black screen is coming after splash screen

eclipse - 如何在 Eclipse web 项目中安装 JDBC 驱动程序而不会遇到 java.lang.ClassNotFoundexception

jquery - 无法让使用 Bower 安装的文件在 Eclipse 中工作

java - Java 中 while 和 for 的组合

java - imacros - 使用 javascript 读取文本文件

java - Class.forName() 不适用于特定类

java - 关闭套接字问题

java - Android InputStream 无法接收来自蓝牙 HC-05 的完整消息

java - 使用 arraylist、Java 在文件中搜索和替换

java - 如何访问 Eclipse 项目文件夹中的图像文件