Продолжаю изучать многопоточность по исходникам spring-core. Искал по пакету java.util.concurrent и нашел:

class DelegatingCompletableFuture<T> extends CompletableFuture<T> {

	private final Future<T> delegate;


	public DelegatingCompletableFuture(Future<T> delegate) {
		Assert.notNull(delegate, "Delegate must not be null");
		this.delegate = delegate;
	}


	@Override
	public boolean cancel(boolean mayInterruptIfRunning) {
		boolean result = this.delegate.cancel(mayInterruptIfRunning);
		super.cancel(mayInterruptIfRunning);
		return result;
	}

}

Я не понял зачем нужно оборачивать делегата и иметь возможность отменять его. Я лишь могу предположить, что делегат обрабатывается отдельно, но хочется иметь возможность отменять делегата вместе с какой-то еще выполняемой задачей. Вот так выглядит CompletableFuture Читайте перед сном: вы либо уснете, либо узнаете что-то интересное из хорошо написанного и документированного кода Doug Lea, специалиста в области многопоточного программирования. Он соавтор крутейшей книги по многопоточности в Java:Java Concurrency in Practice

С DelegatingCompletableFuture я решил посмотрть коммиты на github.

И все равно не понял зачем он. Почему нельзя отменять напрямую делегата, не создавая обертку. Тем более, что никакие методы не переопределяются и делегата можно только отменять, а все остальные вызовы вернут какую-то ересь. Но Juergen Hoeller должно быть виднее, пожалуй спрошу его напрямую) Ну и конечно можно сделать свой пулл реквест и засабмитить в Spring. Если примут будешь контрибьютором, если не примут объяснят в чем неправ и зачем нужен DelegatingCompletableFuture.