reactor-core/src/main/java/reactor/core/publisher/Flux.java
@Nullable
	public final T blockFirst(Duration timeout) {
		BlockingFirstSubscriber<T> subscriber = new BlockingFirstSubscriber<>();
		Operators.onLastAssembly(this).subscribe(Operators.toCoreSubscriber(subscriber));
		return subscriber.blockingGet(timeout.toMillis(), TimeUnit.MILLISECONDS);
	}
@Nullable
	public final T blockFirst(Duration timeout) {
		BlockingFirstSubscriber<T> subscriber = new BlockingFirstSubscriber<>();
		Operators.onLastAssembly(this).subscribe(Operators.toCoreSubscriber(subscriber));
		return subscriber.blockingGet(timeout.toMillis(), TimeUnit.MILLISECONDS);
	}
Subscribe to this {@link Flux} and <strong>block</strong> until the upstream
signals its first value, completes or a timeout expires. Returns that value,
or null if the Flux completes empty. In case the Flux errors, the original
exception is thrown (wrapped in a {@link RuntimeException} if it was a checked
exception). If the provided timeout expires,a {@link RuntimeException} is thrown.
<p>
Note that each blockFirst() will trigger a new subscription: in other words,
the result might miss signal from hot publishers.

<p>
<img class="marble" src="doc-files/marbles/blockFirstWithTimeout.svg" alt="">

@param timeout maximum time period to wait for before raising a {@link RuntimeException}
@return the first value or null