@Override
    public Runnable beforeTaskExecute(@NonNull Runnable runnable) {
        for (TaskDecorator decorator : decorators) {
            runnable = decorator.decorate(runnable);
        }
        return runnable;
    }
@Test
    public void testBeforeTaskExecute() {
        ExtensibleThreadPoolExecutor executor = new ExtensibleThreadPoolExecutor(
                "test", new DefaultThreadPoolPluginManager(),
                5, 5, 1000L, TimeUnit.MILLISECONDS,
                new ArrayBlockingQueue<>(1), Thread::new, new ThreadPoolExecutor.DiscardPolicy());
        TaskDecoratorPlugin plugin = new TaskDecoratorPlugin();
        plugin.addDecorator(runnable -> () -> {
            taskExecuteCount.incrementAndGet();
            runnable.run();
        });
        plugin.addDecorator(runnable -> () -> {
            taskExecuteCount.incrementAndGet();
            runnable.run();
        });
        executor.register(plugin);
        executor.execute(() -> {
        });
        ThreadUtil.sleep(500L);
        Assert.assertEquals(2, taskExecuteCount.get());
    }