我们已经见到工作空间代码必须知道并行,即使它未使用并行框架也是如此。工作空间更改的批处理和调度规则的使用有助于将工作空间与正在修改该工作空间的其它插件(及其线程)共享。一旦插件要使用批处理和规则(请参阅对资源更改进行批处理),就可以很方便地使用平台并行机制执行相同的工作。
作业是与其它作业并发运行的基本异步工作单元。资源插件将 WorkspaceJob 定义为用于定义异步资源修改的便利机制。通常在 IWorkspaceRunnable 中进行批处理的代码反而会放在工作空间作业子类型的 runInWorkspace 方法中。调度该作业与调度其它任何作业一样,不使用 IWorkspace 协议运行该代码。在调度作业之前,必须对其添加相应的调度规则。
我们来看看下面的工作空间可运行程序示例以及我们应如何使其成为作业:
IWorkspaceRunnable myRunnable = new IWorkspaceRunnable() { public void run(IProgressMonitor monitor) throws CoreException { //do the actual work in here doSomeWork(); ... } }
将工作移至 WorkspaceJob 子类型的适当方法。
class MyWorkspaceJob extends WorkspaceJob { public MyWorkspaceJob() { super("My Workspace Job"); } public IStatus runInWorkspace(IProgressMonitor monitor) { //do the actual work in here doSomeWork(); return Status.OK_STATUS; } }
必须专门调用可运行程序:
IWorkspace workspace = ResourcesPlugin.getWorkspace(); workspace.run(myRunnable, myProject, IWorkspace.AVOID_UPDATE, null);
调度该作业与调度其它任何作业一样。平台作业管理器将根据其优先级、队列中的其它作业以及调度规则来运行它。注意,我们必须对该作业附加调度规则以避免同时修改 myProject。
MyWorkspaceJob job = new MyWorkspaceJob(); job.setRule(myProject); job.schedule();
现在该操作已经构造成作业,可以使用所有调度机制(优先级、延迟和重新调度)了。资源更改事件将进行批处理,直到作业完成运行为止。