包装ExecutorService以提供自定义执行

时间:2012-07-02 13:43:34

标签: java concurrency monitoring executorservice reentrantlock

我想编写一个可重复使用的代码片段,以便在向执行程序服务提交任务时允许等待条件。如果有太多的任务排队,那么有许多实现方法可以用于整齐的阻塞方法。 here

我需要一个执行器来评估所有等待的线程,每次完成任务。为了决定是否允许提交任务atm,必须考虑所有活动任务的当前状态。我提出了以下解决方案,它不需要为多个提交者或高级别的同时执行任务进行扩展。

问题:以下代码是否可以安全使用,或者是否存在一些我缺失的漏洞?实现aquireAccess ConditionEvaluator<T>方法的人必须确保查询中的线程状态是线程安全的,但实现者不需要保护activeTasks集合上的迭代。这是代码:

public class BlockingExecutor<T extends Runnable> {

    private final Executor executor;

    private final ConditionEvaluator<T> evaluator;

    final ReentrantLock lock = new ReentrantLock();

    final Condition condition = this.lock.newCondition();

    final LinkedList<T> active = new LinkedList<T>();

    private final long reevaluateTime;

    private final TimeUnit reevaluateTimeUnit;

    public BlockingExecutor(Executor executor, ConditionEvaluator<T> evaluator) {
        this.evaluator = evaluator;
        this.executor = executor;
        this.reevaluateTimeUnit = null;
        this.reevaluateTime = 0;
    }

    public BlockingExecutor(Executor executor, ConditionEvaluator<T> evaluator, long reevaluateTime, TimeUnit reevaluateTimeUnit) {
        this.evaluator = evaluator;
        this.executor = executor;
        this.reevaluateTime = reevaluateTime;
        this.reevaluateTimeUnit = reevaluateTimeUnit;
    }

    public void submitTask(final T task) throws InterruptedException {
        this.lock.lock();
        try {
            do{
            if (this.reevaluateTimeUnit == null) {
                this.condition.await(this.reevaluateTime, this.reevaluateTimeUnit);
            } else {
                this.condition.await();
            }
            }while(!this.evaluator.aquireAccess(this.active, task));
                this.active.add(task);
                this.executor.execute(new Runnable() {

                    @Override
                    public void run() {
                        try {
                            task.run();
                        } finally {
                            BlockingExecutor.this.lock.lock();
                            try{
                                BlockingExecutor.this.active.remove(task);
                                BlockingExecutor.this.condition.signalAll();
                            }finally{
                                BlockingExecutor.this.lock.unlock();
                            }

                        }
                    }
                });
        } finally {
            this.lock.unlock();
        }
    }
}

public interface ConditionEvaluator<T extends Runnable> {
    public boolean aquireAccess(Collection<T> activeList,T task);   
}

问题:代码可以改进吗?

0 个答案:

没有答案