CompletableFuture.supplyAsync在jdk11下的坑
CompletableFuture.supplyAsync 使用的线程池在默认情况下是 jdk 的 ForkJoinPool.common。
在jdk11的情况下该类创建的线程使用的classLoader是SystemClassLoader,这会造成一些场景下需要在该线程中动态加载业务类的话,会出现class not found。
解决方式就是不使用jdk默认提供的ForkJoin线程池。
private static final Executor executor = new ForkJoinPool(Runtime.getRuntime().availableProcessors(), new DefaultForkJoinWorkerThreadFactory(), null, false); private static final class DefaultForkJoinWorkerThreadFactory implements ForkJoinPool.ForkJoinWorkerThreadFactory { @Override public final ForkJoinWorkerThread newThread(ForkJoinPool pool) { return new CustomerForkJoinWorkerThread(pool); } private static class CustomerForkJoinWorkerThread extends ForkJoinWorkerThread { private CustomerForkJoinWorkerThread(final ForkJoinPool pool) { super(pool); // set the correct classloader here setContextClassLoader(Thread.currentThread().getContextClassLoader()); } } } CompletableFuture.supplyAsync(() -> { 你的业务逻辑 }, executor);
下一篇:
Java学习路线个人总结-博客