Eclipse plugin 在运行作业时将消息提供给用户

Eclipse plugin 在运行作业时将消息提供给用户,eclipse-plugin,eclipse-rcp,eclipse-cdt,jobs,Eclipse Plugin,Eclipse Rcp,Eclipse Cdt,Jobs,我有一个方法buildTargets(),当用户单击其中一个UI菜单操作时调用该方法 静态公共void构建目标(Shell Shell,最终IMakeTarget[]目标){ 节约所有资源(目标); Job targetJob=新作业(MakeUIPlugin.getResourceString(“TargetBuild.backgroundTask.name”){/$NON-NLS-1$ @凌驾 受保护的IStatus运行(IProgressMonitor监视器){ monitor.begin

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

静态公共void构建目标(Shell Shell,最终IMakeTarget[]目标){
节约所有资源(目标);
Job targetJob=新作业(MakeUIPlugin.getResourceString(“TargetBuild.backgroundTask.name”){/$NON-NLS-1$
@凌驾
受保护的IStatus运行(IProgressMonitor监视器){
monitor.beginTask(MakeUIPlugin.getResourceString(“TargetBuild.monitor.beginTask”)、targets.length);/$NON-NLS-1$
试一试{
for(int i=0;i
当用户再次单击相同类型的操作时,它只会在运行第一个操作时忽略第二个请求。这是我的要求,我认为
IWorkspace.run()
方法正在这样做(据我所知)。第二个操作是执行除
IWorkspace.run()方法之外的所有代码

我尝试添加一个侦听器

targetJob.addJobChangeListener(新的JobChangeAdapter(){
公共作废完成(IJobChangeEvent事件){
if(event.getResult().isOK())
System.out.println(“作业成功完成”);
其他的
System.out.println(“作业未成功完成”);
}
});
targetJob.setSystem(真);
但是,当我在运行第一个作业时第二次单击菜单操作时,我的handler的
execute()
方法仍然调用
buildTargets()
,并在不运行
IWorkspace.run()
方法的情况下执行所有代码。我的控制台打印结束s.o.p.“作业已成功完成”以进行第二次单击

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


提前谢谢

创建
作业时
可以添加一个
IJobChangeListener
来通知作业的状态:

targetJob.addJobChangeListener(监听器);
侦听器有一个
done
方法,在作业完成时调用该方法


当作业更改侦听器“完成”方法计划和清除作业时,需要维护“作业活动”标志集。菜单处理程序必须检查此标志。

我使用了
java.util.concurrent.locks.ReentrantLock
来解决我的问题。谢谢

嗨,格雷格,谢谢你的快速回复。请检查我更新的问题?您需要有一个作业活动标志进行测试-添加到答案中