123 protected void threadTerminated(T value) {
124 terminatedValues.add(value);
125 }
126
127 @Override
128 protected T initialValue() {
129 return initialValue;
130 }
131 };
132
133 Thread carrier;
134
135 // use a single worker thread pool for the cheduler
136 try (var pool = Executors.newSingleThreadExecutor()) {
137
138 // capture carrier Thread
139 carrier = pool.submit(Thread::currentThread).get();
140
141 ThreadFactory factory = virtualThreadBuilder(pool)
142 .name("ttl-test-virtual-", 0)
143 .allowSetThreadLocals(false)
144 .factory();
145 try (var executor = Executors.newThreadPerTaskExecutor(factory)) {
146 executor.submit(() -> ttlOps.accept(ttl)).get();
147 }
148
149 assertTrue(terminatedValues.isEmpty(),
150 "Unexpected terminated values after virtual thread terminated");
151 }
152
153 // wait for carrier to terminate
154 carrier.join();
155
156 assertEquals(terminatedValues, expectedTerminatedValues);
157 }
158
159 /**
160 * Returns a builder to create virtual threads that use the given scheduler.
161 */
162 static Thread.Builder.OfVirtual virtualThreadBuilder(Executor scheduler) {
163 try {
|
123 protected void threadTerminated(T value) {
124 terminatedValues.add(value);
125 }
126
127 @Override
128 protected T initialValue() {
129 return initialValue;
130 }
131 };
132
133 Thread carrier;
134
135 // use a single worker thread pool for the cheduler
136 try (var pool = Executors.newSingleThreadExecutor()) {
137
138 // capture carrier Thread
139 carrier = pool.submit(Thread::currentThread).get();
140
141 ThreadFactory factory = virtualThreadBuilder(pool)
142 .name("ttl-test-virtual-", 0)
143 .factory();
144 try (var executor = Executors.newThreadPerTaskExecutor(factory)) {
145 executor.submit(() -> ttlOps.accept(ttl)).get();
146 }
147
148 assertTrue(terminatedValues.isEmpty(),
149 "Unexpected terminated values after virtual thread terminated");
150 }
151
152 // wait for carrier to terminate
153 carrier.join();
154
155 assertEquals(terminatedValues, expectedTerminatedValues);
156 }
157
158 /**
159 * Returns a builder to create virtual threads that use the given scheduler.
160 */
161 static Thread.Builder.OfVirtual virtualThreadBuilder(Executor scheduler) {
162 try {
|