diff --git a/jetty-core/jetty-util/src/test/java/org/eclipse/jetty/util/thread/VirtualThreadPoolTest.java b/jetty-core/jetty-util/src/test/java/org/eclipse/jetty/util/thread/VirtualThreadPoolTest.java index e1f5cdbff27c..55591362099e 100644 --- a/jetty-core/jetty-util/src/test/java/org/eclipse/jetty/util/thread/VirtualThreadPoolTest.java +++ b/jetty-core/jetty-util/src/test/java/org/eclipse/jetty/util/thread/VirtualThreadPoolTest.java @@ -117,16 +117,22 @@ public void testTrackingDump() throws Exception assertThat(trackingExecutor.size(), is(0)); CountDownLatch running = new CountDownLatch(4); - Waiter waiter = new Waiter(running, false); - Waiter spinner = new Waiter(running, true); + CountDownLatch release = new CountDownLatch(1); + Waiter[] waiters = + { + new Waiter(running, release, false), + new Waiter(running, release, true), + new Waiter(running, release, false), + new Waiter(running, release, true) + }; try { - vtp.execute(waiter); - vtp.execute(spinner); - vtp.execute(waiter); - vtp.execute(spinner); + for (Waiter waiter : waiters) + vtp.execute(waiter); assertTrue(running.await(5, TimeUnit.SECONDS)); + await().atMost(5, TimeUnit.SECONDS).until(waiters[0].getThread()::getState, is(Thread.State.WAITING)); + await().atMost(5, TimeUnit.SECONDS).until(waiters[2].getThread()::getState, is(Thread.State.WAITING)); assertThat(trackingExecutor.size(), is(4)); vtp.setDetailedDump(false); @@ -143,11 +149,13 @@ public void testTrackingDump() throws Exception assertThat(count(dump, "waiting"), is(2)); assertThat(count(dump, "VirtualThreadPoolTest.java"), is(4)); assertThat(count(dump, "CountDownLatch.await("), is(2)); + + release.countDown(); + await().atMost(5, TimeUnit.SECONDS).until(trackingExecutor::size, is(0)); } finally { - waiter.countDown(); - spinner.countDown(); + release.countDown(); vtp.stop(); } } @@ -209,28 +217,35 @@ public static int count(String str, String subStr) return count; } - private static class Waiter extends CountDownLatch implements Runnable + private static class Waiter implements Runnable { private final CountDownLatch _running; + private final CountDownLatch _release; private final boolean _spin; + private Thread _thread; - public Waiter(CountDownLatch running, boolean spin) + public Waiter(CountDownLatch running, CountDownLatch release, boolean spin) { - super(1); _running = running; + _release = release; _spin = spin; } + public Thread getThread() + { + return _thread; + } + @Override public void run() { try { + _thread = Thread.currentThread(); _running.countDown(); - while (_spin && getCount() > 0) + while (_spin && _release.getCount() > 0) Thread.onSpinWait(); - if (!await(10, TimeUnit.SECONDS)) - throw new IllegalStateException(); + _release.await(); } catch (InterruptedException e) {