Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 异步URLClassLoader引发ClassNotFoundException_Java_Asynchronous - Fatal编程技术网

Java 异步URLClassLoader引发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),

我尝试异步加载类文件,但似乎每次尝试异步加载时,它都会抛出ClassNotFoundException

通过查看类的源代码,ClassLoader应该是异步的(它会自动同步),但我只有在从创建URLClassLoader的线程以外的线程加载类时才会遇到问题

例如: 线程1加载URL并创建URLClassLoader 线程2使用URLClassLoader加载my/example/Foo.class。它将my.example.Foo传递给ClassLoader#loadClass(String),并抛出ClassNotFoundException

示例代码:

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被没有错误和线程没有错误所愚弄,结果该方法只是冻结了另一个线程。。。不过我认为你是对的。