Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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();
}
}
Expand Down Expand Up @@ -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)
{
Expand Down
Loading