java - Eclipse RCP IJob : Limit numer of concurrent executing jobs

标签 java eclipse-rcp

如何告诉 Eclipse RCP 作业管理同时运行最多 x 个作业?

编辑:

它通过使用答案中描述的自定义调度规则来工作。

切勿将相同的规则引用传递给多个作业,这一点很重要。

这是我使用的类:

公共(public)课JobMaster{

private class Listener implements IJobChangeListener {

    @Override
    public void aboutToRun(final IJobChangeEvent event) {
    }

    @Override
    public void awake(final IJobChangeEvent event) {
    }

    @Override
    public void done(final IJobChangeEvent event) {
        synchronized (JobMaster.this) {
            running--;
            System.err.println("now running " + running);
        }
    }

    @Override
    public void running(final IJobChangeEvent event) {
        synchronized (JobMaster.this) {
            running++;
            System.err.println("now running " + running);
        }
    }

    @Override
    public void scheduled(final IJobChangeEvent event) {

    }

    @Override
    public void sleeping(final IJobChangeEvent event) {
    }

}

private class MyRule implements ISchedulingRule {

    public MyRule() {

    }

    @Override
    public boolean contains(final ISchedulingRule rule) {
        if (rule == this) {
            return true;
        }
        return false;

    }

    @Override
    public boolean isConflicting(final ISchedulingRule rule) {
        synchronized (JobMaster.this) {
            if (rule == this) {
                return true;
            }
            if (rule instanceof MyRule) {
                return running >= maxRun;
            }
            return false;
        }
    }
}

private final Listener l = new Listener();

private final int maxRun;

private volatile int running = 0;

public JobMaster(final int maxRun) {
    this.maxRun = maxRun;

}

public synchronized void add(final Job j) {
    j.setRule(new MyRule());
    j.addJobChangeListener(l);
    j.schedule();
}

}

最佳答案

从 Eclipse Mars (4.5) 开始,可以使用作业组来限制并发线程的数量:

JobGroup jobGroup = new JobGroup("Job...", /* maxThreads*/ 10, /* seedJobsCount */ 100);

for (int ii = 0; ii < 100; ii++)
{            
    Job job = new Job("job name")
    {
        @Override
        protected IStatus run(IProgressMonitor monitor)
        {
            // do something
            return Status.OK_STATUS;
        }
    };
    job.setJobGroup(jobGroup);
    job.schedule();
}

jobGroup.join(10000, monitor);

关于java - Eclipse RCP IJob : Limit numer of concurrent executing jobs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23007517/

相关文章:

java - VB.NET Web 服务客户端访问 Java Web 服务 - 连接中止

java - 当我们使用Thread的join方法时,前一个线程如何再次启动

Java ExecutorService 实现协助

Eclipse 插件设置 - 激活和单例设置

eclipse-plugin - 将 "Create Jira Ticket" View 添加到 Eclipse RCP 应用程序

java - 我的Java项目应使用什么框架/技术堆栈?

java - 如何使用 Apache PDFBox - java 将文本字段对齐/排列为两列布局

eclipse-rcp - Eclipse RCP 应用程序中的曲线选项卡

java - 如何以编程方式从 jar 文件中导入插件和片段

java - 树中的所有节点都没有扩展