Это реализация класса BoundedExecutor в книге Java Concurrency in Practice:
public class BoundedExecutor {
private final Executor exec;
private final Semaphore semaphore;
public BoundedExecutor(Executor exec, int bound) {
this.exec = exec;
this.semaphore = new Semaphore(bound);
}
public void submitTask(final Runnable command) throws InterruptedException {
semaphore.acquire();
try {
exec.execute(new Runnable() {
public void run() {
try {
command.run();
} finally {
semaphore.release();
}
}
});
} catch (RejectedExecutionException e) {
semaphore.release();
}
}
}
Есть ли причина, по которой RejectedExecutionException перехватывается, а не распространяется дальше?В этом случае, если задача отклонена, тот, кто ее отправит, не будет мудрее.
Не лучше ли просто заменить блок catch на блок finally?
Это моя реализация BoundedExecutor, который принимает Callable вместо Runnable:
public class BoundedExecutor {
private final ExecutorService exec;
private final Semaphore semaphore;
public BoundedExecutor(ExecutorService exec, int bound) {
this.exec = exec;
this.semaphore = new Semaphore(bound);
}
public <V> Future<V> submitTask(final Callable<V> command) throws InterruptedException {
semaphore.acquire();
try {
return exec.submit(new Callable<V>() {
@Override public V call() throws Exception {
try {
return command.call();
} finally {
semaphore.release();
}
}
});
} catch (RejectedExecutionException e) {
semaphore.release();
throw e;
}
}
}
Это правильная реализация?
Спасибо!