Java 为每个线程创建静态库的实例

Java 为每个线程创建静态库的实例,java,multithreading,static,Java,Multithreading,Static,我使用的库在我的程序中包含很多静态方法。我想并行运行一些调用这些静态方法的代码(多线程)。这会导致一个问题,因为只有一个静态类的实例在线程之间共享。这会导致崩溃。是否可以为每个线程创建此库的实例?我无法更改库中的任何代码,因为它是封闭源代码 我的线程中的run方法: public void run(){ for (String formula : input) { try { Formula converted = (Formula) logic.

我使用的库在我的程序中包含很多静态方法。我想并行运行一些调用这些静态方法的代码(多线程)。这会导致一个问题,因为只有一个静态类的实例在线程之间共享。这会导致崩溃。是否可以为每个线程创建此库的实例?我无法更改库中的任何代码,因为它是封闭源代码

我的线程中的run方法:

public void run(){
    for (String formula : input) {
        try {
            Formula converted = (Formula) logic.createExpression(formula);
            System.out.println(converted);
            Formula  cnf = ClassicalLogic.Utilities.conjunctiveForm(converted, true);
            if (cnf.toString().equals("true")) {
                convertedFormulae.add(ClassicalLogic.Utilities.conjunctiveForm(converted));
            } else {
                convertedFormulae.add(cnf);
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
    converter.threadReady(convertedFormulae);
}
问题在于线路:

Formula  cnf = ClassicalLogic.Utilities.conjunctiveForm(converted, true);

我真正想问的是如何为每个线程创建一个单独的ClassicalLogic.utilities实例?

您可以为每个线程使用不同的类加载器。这方面的东西应该会有所帮助

run
方法中尝试此方法(假设jar文件为classicallogic.jar:

URLClassLoader clsLoader = 
     URLClassLoader.newInstance(new URL[] {new URL("file:///<path_to_classicallogic.jar>")});
Class cls = clsLoader.loadClass("classicallogic.ClassicalLogic.Utilities");
Method cF1 = cls.getMethod("conjunctiveForm", Formula.class);
Method cF2 = cls.getMethod("conjunctiveForm", Formula.class, boolean.class);
URLClassLoader-clsLoader=
newInstance(新URL[]{newURL(“文件:/”)});
Class cls=clsLoader.loadClass(“ClassCallLogic.ClassCallLogic.Utilities”);
方法cF1=cls.getMethod(“convertiveForm”,Formula.class);
方法cF2=cls.getMethod(“convertiveForm”,Formula.class,boolean.class);
那就不打电话了

ClassicalLogic.Utilities.convertiveForm(已转换,true)

ClassicalLogic.Utilities.connectiveForm(已转换)

你这么做

调用(null,转换,true);


cF1.invoke(null,已转换);

我看不出有问题;实际的错误是什么?静态方法本身不是问题,但静态字段中的共享数据是问题。是的,问题是这个静态方法更改了Utilities类中某些静态字段的值,导致在某些线程中引发NullPointerException,因为数据是由mu更改的同时有多个线程。处理此问题的一种方法是为ClassCallLogic.Utilities创建自己的代理类,并同步所有方法,并使用您的类而不是ClassCallLogic.Utilities。但是,如果在单个线程中执行整个过程都需要数据完整性,则此方法将毫无帮助。或者,您可以使用不同的类每个线程加载程序,并通过线程的类加载程序显式加载ClassicLogic。每个线程中的实用程序。那么,从技术上讲,同一个类将有不同的版本,并且它们不会共享静态成员。@Peter L谢谢!我该怎么做?