< prev index next >

test/jdk/java/lang/Thread/virtual/ThreadAPI.java

Print this page
*** 1106,14 ***
          }
          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();
--- 1106,45 ---
          }
          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();

*** 1137,11 ***
  
      /**
       * 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
          });
--- 1168,11 ---
  
      /**
       * 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
          });

*** 1150,11 ***
  
      /**
       * 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 {
--- 1181,11 ---
  
      /**
       * 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 >