< prev index next >
test/jdk/java/util/concurrent/tck/ThreadPoolExecutorTest.java
Print this page
8221892: ThreadPoolExecutor: Thread.isAlive() is not equivalent to not being startable
Reviewed-by: martin, dholmes
*** 2009,2014 ****
--- 2009,2059 ----
assertTrue(p.getRejectedExecutionHandler() instanceof AbortPolicy);
assertEquals(0, p.getTaskCount());
assertTrue(p.getQueue().isEmpty());
}
+ public void testThreadFactoryReturnsTerminatedThread_shouldThrow() {
+ if (!testImplementationDetails)
+ return;
+
+ ThreadFactory returnsTerminatedThread = runnableIgnored -> {
+ Thread thread = new Thread(() -> {});
+ thread.start();
+ try { thread.join(); }
+ catch (InterruptedException ex) { throw new Error(ex); }
+ return thread;
+ };
+ ThreadPoolExecutor p =
+ new ThreadPoolExecutor(1, 1, 1, SECONDS,
+ new ArrayBlockingQueue<Runnable>(1),
+ returnsTerminatedThread);
+ try (PoolCleaner cleaner = cleaner(p)) {
+ assertThrows(IllegalThreadStateException.class,
+ () -> p.execute(() -> {}));
+ }
+ }
+
+ public void testThreadFactoryReturnsStartedThread_shouldThrow() {
+ if (!testImplementationDetails)
+ return;
+
+ CountDownLatch latch = new CountDownLatch(1);
+ Runnable awaitLatch = () -> {
+ try { latch.await(); }
+ catch (InterruptedException ex) { throw new Error(ex); }};
+ ThreadFactory returnsStartedThread = runnable -> {
+ Thread thread = new Thread(awaitLatch);
+ thread.start();
+ return thread;
+ };
+ ThreadPoolExecutor p =
+ new ThreadPoolExecutor(1, 1, 1, SECONDS,
+ new ArrayBlockingQueue<Runnable>(1),
+ returnsStartedThread);
+ try (PoolCleaner cleaner = cleaner(p)) {
+ assertThrows(IllegalThreadStateException.class,
+ () -> p.execute(() -> {}));
+ latch.countDown();
+ }
+ }
+
}
< prev index next >