Java 异步URLClassLoader引发ClassNotFoundException
我尝试异步加载类文件,但似乎每次尝试异步加载时,它都会抛出ClassNotFoundException 通过查看类的源代码,ClassLoader应该是异步的(它会自动同步),但我只有在从创建URLClassLoader的线程以外的线程加载类时才会遇到问题 例如: 线程1加载URL并创建URLClassLoader 线程2使用URLClassLoader加载my/example/Foo.class。它将my.example.Foo传递给ClassLoader#loadClass(String),并抛出ClassNotFoundException 示例代码:Java 异步URLClassLoader引发ClassNotFoundException,java,asynchronous,Java,Asynchronous,我尝试异步加载类文件,但似乎每次尝试异步加载时,它都会抛出ClassNotFoundException 通过查看类的源代码,ClassLoader应该是异步的(它会自动同步),但我只有在从创建URLClassLoader的线程以外的线程加载类时才会遇到问题 例如: 线程1加载URL并创建URLClassLoader 线程2使用URLClassLoader加载my/example/Foo.class。它将my.example.Foo传递给ClassLoader#loadClass(String),
URLClassLoader loader = new URLClassLoader(myJarURLs, getClass().getClassLoader());
ExecutorService executor = Executors.newCachedThreadPool();
CompleteableFuture.supplyAsync(() -> {
Thread.currentThread().setContextClassLoader(loader);
loader.loadClass("my.example.Foo")
}, executor);
executor.shutdown();
我知道我的代码可以工作,当所有代码都在一个线程上运行时工作正常。解决方案是创建一个新的URLClassLoader,因为URLPathLoader似乎不是线程安全的,并将线程的上下文类装入器设置为URLClassLoader。
这是一种没有解释的解决方法,但我只能想出来。最好在自定义线程工厂中为线程设置类装入器。这段代码会产生令人困惑的行为,因为线程的类加载器与您试图用来加载类的类加载器不同。您介意给我一个自定义线程工厂的示例吗,它是什么样子的?我不知道类加载器是特定于线程的。哦,天哪,@Boristeider,你说得对!我使用了线程的类加载器,而不是类中的类加载器,它工作得很好。不要太惊讶-我有时会得到正确的答案:PI被没有错误和线程没有错误所愚弄,结果该方法只是冻结了另一个线程。。。不过我认为你是对的。