public static RejectedExecutionHandler runsOldestTaskPolicy() {
        return (r, executor) -> {
            if (executor.isShutdown()) {
                return;
            }
            BlockingQueue<Runnable> workQueue = executor.getQueue();
            Runnable firstWork = workQueue.poll();
            boolean newTaskAdd = workQueue.offer(r);
            if (firstWork != null) {
                firstWork.run();
            }
            if (!newTaskAdd) {
                executor.execute(r);
            }
        };
    }
@Test
    public void testRunsOldestTaskPolicy() throws Exception {
        AtomicInteger atomicInteger = new AtomicInteger();
        ThreadPoolExecutor poolExecutor =
            new ThreadPoolExecutor(DEFAULT_CORE_POOL_SIZE, DEFAULT_CORE_POOL_SIZE, DEFAULT_KEEP_ALIVE_TIME,
                TimeUnit.MILLISECONDS,
                new LinkedBlockingQueue<>(MAX_QUEUE_SIZE),
                new NamedThreadFactory("OldestRunsPolicy", DEFAULT_CORE_POOL_SIZE),
                RejectedPolicies.runsOldestTaskPolicy());
        CountDownLatch downLatch1 = new CountDownLatch(1);
        CountDownLatch downLatch2 = new CountDownLatch(1);
        CountDownLatch downLatch3 = new CountDownLatch(1);
        //task1
        poolExecutor.execute(() -> {
            try {
                //wait the oldest task of queue count down
                downLatch1.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            atomicInteger.getAndAdd(1);
        });
        assertThat(atomicInteger.get()).isEqualTo(0);
        //task2
        poolExecutor.execute(() -> {
            // run second
            atomicInteger.getAndAdd(2);
        });
        //task3
        poolExecutor.execute(() -> {
            downLatch2.countDown();
            //task3 run
            atomicInteger.getAndAdd(3);
            downLatch3.countDown();
        });
        //only the task2 run which is the oldest task of queue
        assertThat(atomicInteger.get()).isEqualTo(2);
        downLatch1.countDown();
        downLatch2.await();
        //wait task3 run +3
        downLatch3.await();
        //run task3
        assertThat(atomicInteger.get()).isEqualTo(6);

    }