1

我正在使用 Job 类来创建一些任务,并且正在使用进度监视器在进度视图中显示进度。

    Job createNewJobRun(final int i, final Job previousJob) {
    Job job = new Job("Test Job " + i) {
        @Override
        protected IStatus run(IProgressMonitor monitor) {
            monitor.beginTask("Job is running", 100); //$NON-NLS-1$

            if (previousJob != null) {
                try {
                    previousJob.join();

                } catch (InterruptedException e1) {
                    e1.printStackTrace();
                }
            }
                            // do the real work 
            monitor.done();
            return Status.OK_STATUS;
        }
    };

    job.schedule();
    return job;

}

我不想并行但顺序地运行作业,如何在进度视图中初始化作业以显示将在前一个完成后执行。上面的代码只是等待前一个,所以它在第二个作业之后阻塞并且没有显示进度条......

4

3 回答 3

3

调度规则应如下所示:

   public class MutexRule implements ISchedulingRule {
      public boolean isConflicting(ISchedulingRule rule) {
         return rule == this;
      }
      public boolean contains(ISchedulingRule rule) {
         return rule == this;
      }
   }

设置规则和调度:

   Job job1 = new SampleJob();
   Job job2 = new SampleJob();
   MutexRule rule = new MutexRule();
   job1.setRule(rule);
   job2.setRule(rule);
   job1.schedule();
   job2.schedule()

来源:Eclipse Wiki:FAQ 如何防止两个作业同时运行?

于 2012-11-21T08:46:25.923 回答
2

You need to look at scheduling rules on Eclipse Jobs.

This should help. http://www.eclipse.org/articles/Article-Concurrency/jobs-api.html

于 2012-11-20T17:11:06.207 回答
0

一个可能的解决方案是使用@TomSeidel 和@SambiReddy 提出的调度规则,但是这个解决方案有很多限制。

特别是,它仅适用于您在所有先前的作业完成之前不安排多个新作业,因为通常使用的调度规则没有顺序的概念。这可以修复,尽管结果通常很难维护。

你没有写任何关于有问题的工作,但如果我们谈论一遍又一遍地重复相同的工作,那么简单的解决方案是在工作完成之前重新安排工作(只是)。

Job job = new Job("Test Job " + i) {
    @Override
    protected IStatus run(IProgressMonitor monitor) {
        monitor.beginTask("Job is running", 100); //$NON-NLS-1$

                        // do the real work 
        monitor.done();

        schedule(...);
        return Status.OK_STATUS;
    }
};

job.schedule();
于 2012-11-21T17:00:27.653 回答