diff --git a/src/main/java/io/reactivex/rxjava4/internal/operators/streamable/StreamableForEach.java b/src/main/java/io/reactivex/rxjava4/internal/operators/streamable/StreamableForEach.java index e9d80f663a..5b1b1d1327 100644 --- a/src/main/java/io/reactivex/rxjava4/internal/operators/streamable/StreamableForEach.java +++ b/src/main/java/io/reactivex/rxjava4/internal/operators/streamable/StreamableForEach.java @@ -105,7 +105,7 @@ public static CompletionStageDisposable forEach( throw ExceptionHelper.wrapOrThrow(finallyCrash); } return null; - }); + }, executor); canceller.add(Disposable.fromFuture(future)); return new CompletionStageDisposable<>(future, canceller); } diff --git a/src/test/java/io/reactivex/rxjava4/internal/operators/streamable/StreamableForEachTest.java b/src/test/java/io/reactivex/rxjava4/internal/operators/streamable/StreamableForEachTest.java index 5bf9b87026..6184a46aea 100644 --- a/src/test/java/io/reactivex/rxjava4/internal/operators/streamable/StreamableForEachTest.java +++ b/src/test/java/io/reactivex/rxjava4/internal/operators/streamable/StreamableForEachTest.java @@ -134,6 +134,25 @@ public void forEachBiUncheckedPropagation() throws Throwable { }); } + @Test + public void forEachBiUsesProvidedExecutor() throws Throwable { + var expectedThread = new AtomicReference(); + var actualThread = new AtomicReference(); + try (var executor = Executors.newSingleThreadExecutor(run -> { + var thread = new Thread(run, "RxJava-Test-Executor"); + expectedThread.set(thread); + return thread; + })) { + var canceller = new CompositeDisposable(); + + Streamable.just(1) + .forEach((_, _) -> actualThread.set(Thread.currentThread()), canceller, executor) + .await(); + + assertSame(expectedThread.get(), actualThread.get()); + } + } + @Test public void forEachOutsideCancel() { var cd = new CompositeDisposable();