0

我有一个方法buildTargets(),当用户单击其中一个 UI 菜单操作时会调用该方法。

static public void buildTargets(Shell shell, final IMakeTarget[] targets) {
        saveAllResources(targets);
        Job targetJob = new Job(MakeUIPlugin.getResourceString("TargetBuild.backgroundTask.name")) { //$NON-NLS-1$
            @Override
            protected IStatus run(IProgressMonitor monitor) {
                monitor.beginTask(MakeUIPlugin.getResourceString("TargetBuild.monitor.beginTask"), targets.length); //$NON-NLS-1$
                try {
                    for (int i = 0; i < targets.length; i++) {
                        final IMakeTarget target = targets[i];
                        IWorkspaceRunnable runnable = new IWorkspaceRunnable() {

                            public void run(IProgressMonitor monitor) throws CoreException {
                                target.build(new SubProgressMonitor(monitor, 1));                               
                            }
                        };

                        MakeUIPlugin.getWorkspace().run(runnable, null, IResource.NONE, new SubProgressMonitor(monitor, 1));
                    }
                } catch (CoreException e) {
                    return e.getStatus();
                } catch (OperationCanceledException e) {
                } finally {
                    monitor.done();
                }
                return Status.OK_STATUS;
            }

            @Override
            public boolean belongsTo(Object family) {
                return ResourcesPlugin.FAMILY_MANUAL_BUILD == family;
            }           
        };

        // workaround for bug 270326, initialize CUIPlugin preference store to avoid race condition
        CUIPlugin.getDefault().getPreferenceStore().getString("dummy"); //$NON-NLS-1$
        targetJob.schedule();

    }
}

当用户再次单击相同类型的操作时,它会在运行第一个操作时简单地忽略第二个请求。这是我的要求,我认为该IWorkspace.run()方法正在这样做(据我所知)。第二个操作是执行除IWorkspace.run()方法之外的所有代码。

我试过添加一个监听器。

targetJob.addJobChangeListener(new JobChangeAdapter() {
public void done(IJobChangeEvent event) {
    if (event.getResult().isOK())
       System.out.println("Job completed successfully");
    else
       System.out.println("Job did not complete successfully");
    }
 });

targetJob.setSystem(true);

但是当我在运行第一个作业时第二次单击菜单操作时,我execute()的处理程序方法仍然调用buildTargets()并执行所有代码而不运行该IWorkspace.run()方法。我的控制台打印结束 sop “作业已成功完成”,以便再次单击。

所以,如果用户第二次点击相同的操作,我想给用户一条消息,说等待上一个作业完成。我如何知道第一个作业运行的状态,以便我可以给出消息?我想我需要在方法中创建新工作之前做出决定buildTargets()

提前致谢!

4

2 回答 2

1

创建时,Job您可以添加一个IJobChangeListener以接收有关作业状态的通知:

targetJob.addJobChangeListener(listener);

侦听器有一个done在作业完成时调用的方法。

当作业被作业更改侦听器“完成”方法安排和清除时,您需要维护一个“作业活动”标志设置。菜单处理程序必须检查此标志。

于 2013-10-22T16:11:28.457 回答
0

我已经习惯java.util.concurrent.locks.ReentrantLock了解决我的问题。谢谢!

于 2013-10-24T05:22:57.533 回答