< prev index next >

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

Print this page

1091             ThreadFactory factory = builder.factory();
1092             var thread = factory.newThread(() -> {
1093                 list.add("A");
1094                 var child = factory.newThread(() -> {
1095                     list.add("B");
1096                     Thread.yield();
1097                     list.add("B");
1098                 });
1099                 child.start();
1100                 Thread.yield();
1101                 list.add("A");
1102                 try { child.join(); } catch (InterruptedException e) { }
1103             });
1104             thread.start();
1105             thread.join();
1106         }
1107         assertEquals(List.of("A", "B", "A", "B"), list);
1108     }
1109 
1110     /**
1111      * Test Thread.yield when thread is pinned by native frame.
1112      */
1113     @Test
1114     void testYield2() throws Exception {































1115         assumeTrue(ThreadBuilders.supportsCustomScheduler(), "No support for custom schedulers");
1116         var list = new CopyOnWriteArrayList<String>();
1117         try (ExecutorService scheduler = Executors.newFixedThreadPool(1)) {
1118             Thread.Builder builder = ThreadBuilders.virtualThreadBuilder(scheduler);
1119             ThreadFactory factory = builder.factory();
1120             var thread = factory.newThread(() -> {
1121                 list.add("A");
1122                 var child = factory.newThread(() -> {
1123                     list.add("B");
1124                 });
1125                 child.start();
1126                 VThreadPinner.runPinned(() -> {
1127                     Thread.yield();   // pinned so will be a no-op
1128                     list.add("A");
1129                 });
1130                 try { child.join(); } catch (InterruptedException e) { }
1131             });
1132             thread.start();
1133             thread.join();
1134         }
1135         assertEquals(List.of("A", "A", "B"), list);
1136     }
1137 
1138     /**
1139      * Test Thread.yield does not consume the thread's parking permit.
1140      */
1141     @Test
1142     void testYield3() throws Exception {
1143         var thread = Thread.ofVirtual().start(() -> {
1144             LockSupport.unpark(Thread.currentThread());
1145             Thread.yield();
1146             LockSupport.park();  // should not park
1147         });
1148         thread.join();
1149     }
1150 
1151     /**
1152      * Test Thread.yield does not make available the thread's parking permit.
1153      */
1154     @Test
1155     void testYield4() throws Exception {
1156         var thread = Thread.ofVirtual().start(() -> {
1157             Thread.yield();
1158             LockSupport.park();  // should park
1159         });
1160         try {
1161             await(thread, Thread.State.WAITING);
1162         } finally {
1163             LockSupport.unpark(thread);
1164             thread.join();
1165         }
1166     }
1167 
1168     /**
1169      * Test Thread.onSpinWait.
1170      */
1171     @Test
1172     void testOnSpinWait() throws Exception {
1173         VThreadRunner.run(() -> {
1174             Thread me = Thread.currentThread();
1175             Thread.onSpinWait();

1091             ThreadFactory factory = builder.factory();
1092             var thread = factory.newThread(() -> {
1093                 list.add("A");
1094                 var child = factory.newThread(() -> {
1095                     list.add("B");
1096                     Thread.yield();
1097                     list.add("B");
1098                 });
1099                 child.start();
1100                 Thread.yield();
1101                 list.add("A");
1102                 try { child.join(); } catch (InterruptedException e) { }
1103             });
1104             thread.start();
1105             thread.join();
1106         }
1107         assertEquals(List.of("A", "B", "A", "B"), list);
1108     }
1109 
1110     /**
1111      * Test Thread.yield releases carrier when virtual thread holds a monitor.
1112      */
1113     @Test
1114     void testYield2() throws Exception {
1115         assumeTrue(ThreadBuilders.supportsCustomScheduler(), "No support for custom schedulers");
1116         var list = new CopyOnWriteArrayList<String>();
1117         try (ExecutorService scheduler = Executors.newFixedThreadPool(1)) {
1118             Thread.Builder builder = ThreadBuilders.virtualThreadBuilder(scheduler);
1119             ThreadFactory factory = builder.factory();
1120             var lock = new Object();
1121             var thread = factory.newThread(() -> {
1122                 list.add("A");
1123                 var child = factory.newThread(() -> {
1124                     list.add("B");
1125                     synchronized (lock) {
1126                         Thread.yield();
1127                     }
1128                     list.add("B");
1129                 });
1130                 child.start();
1131                 Thread.yield();
1132                 list.add("A");
1133                 try { child.join(); } catch (InterruptedException e) { }
1134             });
1135             thread.start();
1136             thread.join();
1137         }
1138         assertEquals(List.of("A", "B", "A", "B"), list);
1139     }
1140 
1141     /**
1142      * Test Thread.yield when thread is pinned by native frame.
1143      */
1144     @Test
1145     void testYield3() throws Exception {
1146         assumeTrue(ThreadBuilders.supportsCustomScheduler(), "No support for custom schedulers");
1147         var list = new CopyOnWriteArrayList<String>();
1148         try (ExecutorService scheduler = Executors.newFixedThreadPool(1)) {
1149             Thread.Builder builder = ThreadBuilders.virtualThreadBuilder(scheduler);
1150             ThreadFactory factory = builder.factory();
1151             var thread = factory.newThread(() -> {
1152                 list.add("A");
1153                 var child = factory.newThread(() -> {
1154                     list.add("B");
1155                 });
1156                 child.start();
1157                 VThreadPinner.runPinned(() -> {
1158                     Thread.yield();   // pinned so will be a no-op
1159                     list.add("A");
1160                 });
1161                 try { child.join(); } catch (InterruptedException e) { }
1162             });
1163             thread.start();
1164             thread.join();
1165         }
1166         assertEquals(List.of("A", "A", "B"), list);
1167     }
1168 
1169     /**
1170      * Test Thread.yield does not consume the thread's parking permit.
1171      */
1172     @Test
1173     void testYield4() throws Exception {
1174         var thread = Thread.ofVirtual().start(() -> {
1175             LockSupport.unpark(Thread.currentThread());
1176             Thread.yield();
1177             LockSupport.park();  // should not park
1178         });
1179         thread.join();
1180     }
1181 
1182     /**
1183      * Test Thread.yield does not make available the thread's parking permit.
1184      */
1185     @Test
1186     void testYield5() throws Exception {
1187         var thread = Thread.ofVirtual().start(() -> {
1188             Thread.yield();
1189             LockSupport.park();  // should park
1190         });
1191         try {
1192             await(thread, Thread.State.WAITING);
1193         } finally {
1194             LockSupport.unpark(thread);
1195             thread.join();
1196         }
1197     }
1198 
1199     /**
1200      * Test Thread.onSpinWait.
1201      */
1202     @Test
1203     void testOnSpinWait() throws Exception {
1204         VThreadRunner.run(() -> {
1205             Thread me = Thread.currentThread();
1206             Thread.onSpinWait();
< prev index next >