< prev index next > test/jdk/java/lang/Thread/virtual/ThreadAPI.java
Print this page
}
assertEquals(List.of("A", "B", "A", "B"), list);
}
/**
! * Test Thread.yield when thread is pinned by native frame.
*/
@Test
void testYield2() throws Exception {
assumeTrue(ThreadBuilders.supportsCustomScheduler(), "No support for custom schedulers");
var list = new CopyOnWriteArrayList<String>();
try (ExecutorService scheduler = Executors.newFixedThreadPool(1)) {
Thread.Builder builder = ThreadBuilders.virtualThreadBuilder(scheduler);
ThreadFactory factory = builder.factory();
}
assertEquals(List.of("A", "B", "A", "B"), list);
}
/**
! * Test Thread.yield releases carrier when virtual thread holds a monitor.
*/
@Test
void testYield2() throws Exception {
+ assumeTrue(ThreadBuilders.supportsCustomScheduler(), "No support for custom schedulers");
+ var list = new CopyOnWriteArrayList<String>();
+ try (ExecutorService scheduler = Executors.newFixedThreadPool(1)) {
+ Thread.Builder builder = ThreadBuilders.virtualThreadBuilder(scheduler);
+ ThreadFactory factory = builder.factory();
+ var lock = new Object();
+ var thread = factory.newThread(() -> {
+ list.add("A");
+ var child = factory.newThread(() -> {
+ list.add("B");
+ synchronized (lock) {
+ Thread.yield();
+ }
+ list.add("B");
+ });
+ child.start();
+ Thread.yield();
+ list.add("A");
+ try { child.join(); } catch (InterruptedException e) { }
+ });
+ thread.start();
+ thread.join();
+ }
+ assertEquals(List.of("A", "B", "A", "B"), list);
+ }
+
+ /**
+ * Test Thread.yield when thread is pinned by native frame.
+ */
+ @Test
+ void testYield3() throws Exception {
assumeTrue(ThreadBuilders.supportsCustomScheduler(), "No support for custom schedulers");
var list = new CopyOnWriteArrayList<String>();
try (ExecutorService scheduler = Executors.newFixedThreadPool(1)) {
Thread.Builder builder = ThreadBuilders.virtualThreadBuilder(scheduler);
ThreadFactory factory = builder.factory();
/**
* Test Thread.yield does not consume the thread's parking permit.
*/
@Test
! void testYield3() throws Exception {
var thread = Thread.ofVirtual().start(() -> {
LockSupport.unpark(Thread.currentThread());
Thread.yield();
LockSupport.park(); // should not park
});
/**
* Test Thread.yield does not consume the thread's parking permit.
*/
@Test
! void testYield4() throws Exception {
var thread = Thread.ofVirtual().start(() -> {
LockSupport.unpark(Thread.currentThread());
Thread.yield();
LockSupport.park(); // should not park
});
/**
* Test Thread.yield does not make available the thread's parking permit.
*/
@Test
! void testYield4() throws Exception {
var thread = Thread.ofVirtual().start(() -> {
Thread.yield();
LockSupport.park(); // should park
});
try {
/**
* Test Thread.yield does not make available the thread's parking permit.
*/
@Test
! void testYield5() throws Exception {
var thread = Thread.ofVirtual().start(() -> {
Thread.yield();
LockSupport.park(); // should park
});
try {
< prev index next >