@Test public void shutdownNowOnDelegateExecutor() throws InterruptedException { final ExecutorService executorService = Executors.newSingleThreadExecutor(); try { final OrderedExecutor executor = new OrderedExecutor(executorService); final CountDownLatch latch = new CountDownLatch(1); final AtomicInteger numberOfTasks = new AtomicInteger(0); final CountDownLatch ran = new CountDownLatch(1); executor.execute(() -> { try { latch.await(1, TimeUnit.MINUTES); numberOfTasks.set(executor.shutdownNow()); ran.countDown(); } catch (Exception e) { e.printStackTrace(); } }); for (int i = 0; i < 100; i++) { executor.execute(() -> System.out.println("Dont worry, this will never happen")); } latch.countDown(); ran.await(1, TimeUnit.SECONDS); Assert.assertEquals(100, numberOfTasks.get()); Assert.assertEquals(ProcessorBase.STATE_FORCED_SHUTDOWN, executor.status()); Assert.assertEquals(0, executor.remaining()); } finally { executorService.shutdown(); } }
@Test public void shouldShutdownNowDoNotExecuteFurtherTasks() throws InterruptedException { final long timeoutMillis = TimeUnit.SECONDS.toMillis(10); final ExecutorService executorService = Executors.newSingleThreadExecutor(); try { final OrderedExecutor executor = new OrderedExecutor(executorService); final CountDownLatch executed = new CountDownLatch(1); executor.execute(executed::countDown); Assert.assertTrue("The task must be executed in " + timeoutMillis + " ms", executed.await(timeoutMillis, TimeUnit.MILLISECONDS)); executor.shutdownNow(); Assert.assertEquals("There are no remaining tasks to be executed", 0, executor.remaining()); //from now on new tasks won't be executed final CountDownLatch afterDeatchExecution = new CountDownLatch(1); executor.execute(afterDeatchExecution::countDown); Assert.assertFalse("After shutdownNow no new tasks can be executed", afterDeatchExecution.await(100, TimeUnit.MILLISECONDS)); //to avoid memory leaks the executor must take care of the new submitted tasks immediatly Assert.assertEquals("Any new task submitted after death must be collected", 0, executor.remaining()); } finally { executorService.shutdown(); } }