【问题标题】:Create instance of static library for each thread为每个线程创建静态库实例
【发布时间】:2015-11-12 19:23:08
【问题描述】:

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

我线程中的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.Utilties 实例?

【问题讨论】:

  • 我没有发现问题;实际错误是什么?静态方法本身不是问题,但静态字段中的共享数据是。
  • 是的,问题是这个静态方法改变了 Utilities 类中一些静态字段的值,导致在一些线程中抛出 NullPointerExceptions,因为多个线程同时更改了数据。
  • 处理它的一种方法是为 ClassicalLogic.Utilties 创建您自己的代理类,并同步所有方法,并使用您的类而不是 ClassicalLogic.Utilties。但是,如果您需要在单个线程中执行数据完整性,这将无济于事。或者,您可以为每个线程使用不同的类加载器,并通过线程的类加载器在每个线程中显式加载 ClassicalLogic.Utilities。然后从技术上讲,您将拥有同一类的不同版本,并且它们不会共享静态成员。
  • @Peter L 谢谢!我该怎么做?

标签: java multithreading static


【解决方案1】:

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

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);

然后代替调用

ClassicalLogic.Utilities.conjunctiveForm(converted, true)

ClassicalLogic.Utilities.conjunctiveForm(converted)

你这样做

cF2.invoke(null, converted, true);

cF1.invoke(null, converted);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-13
    • 1970-01-01
    相关资源
    最近更新 更多