Java JACOB库在多线程中使用时失败

Java JACOB库在多线程中使用时失败,java,multithreading,activex,wmi,jacob,Java,Multithreading,Activex,Wmi,Jacob,我有一个奇怪的问题,从两个相同的线程使用雅各布。我有一个实用程序类,它使用静态ActiveXObject字段将各种请求分派到WMI。第一根线很好用。当第二个线程启动时,出现以下异常: com.jacob.com.ComFailException: Can't map name to dispid: ExecQuery at com.jacob.com.Dispatch.invokev(Native Method) at com.jacob.com.Dispatch.invokev(Dispatc

我有一个奇怪的问题,从两个相同的线程使用雅各布。我有一个实用程序类,它使用静态ActiveXObject字段将各种请求分派到WMI。第一根线很好用。当第二个线程启动时,出现以下异常:

com.jacob.com.ComFailException: Can't map name to dispid: ExecQuery
at com.jacob.com.Dispatch.invokev(Native Method)
at com.jacob.com.Dispatch.invokev(Dispatch.java:858)
at com.jacob.com.Dispatch.callN(Dispatch.java:455)
at com.jacob.com.Dispatch.call(Dispatch.java:544)
at com.jacob.activeX.ActiveXComponent.invoke(ActiveXComponent.java:510)
at JacobWmiAdapter.getResultsList(JacobWmiAdapter.java:111)
at JacobWmiAdapter.getResultsList(JacobWmiAdapter.java:104)
at WindowsInfoCollector.getConnectionInfo(WindowsInfoCollector.java:516)
at WindowsInfoCollector.collect(WindowsInfoCollector.java:118)
at DiagnosisExecutor.execute(DiagnosisExecutor.java:128)
at DiagnosisExecutor.run(DiagnosisExecutor.java:160)
at java.lang.Thread.run(Thread.java:662)
通过从GUI中单击鼠标启动线程,但错误可以手动再现:

        DiagnosisExecutor dex = new DiagnosisExecutor();
        Thread thread1 = new Thread(dex);
        Thread thread2 = new Thread(dex);

        thread1.start();
        thread1.join();
        Thread.sleep(1000);
        thread2.start();
在我看来,当使用它们的线程终止时,一些分配的资源没有被正确释放。有什么提示吗


更新:JACOB版本1.14.3

我还没有将最新版本的JACOB与新的线程模型一起使用,但旧版本肯定是线程安全的。从版本1.7>开始,他们改进了线程模型,以更好地反映底层COM组件,但您必须确定所述组件是MTA还是STA,然后适当地初始化类。有关如何根据应用程序的要求适当调整应用程序的信息,请参阅。

当我开始为多个线程设置相同的线程名称时,我开始遇到类似的问题(第一次执行正常,第二次执行失败,无法共同创建对象)。将序列号作为线程名称的后缀为我解决了这个问题。

谢谢您的提示。问题是我并不真正需要线程安全性(一次只有一个线程在使用库),但JACOB似乎仍然无法正确地进行内务管理。我的解决方案是:因为使用ComThread.release()释放资源的天真方法不起作用,我从以静态方式使用JACOB实用程序类转向在其实例上调用方法。因此,主ActiveXObject也在内部重新实例化。这可能会导致COM层内部出现一些漏洞,但作为一个务实的人,我真的不在乎。这个操作将被调用2次,每个会话最多调用3次,我宁愿像这样解决这个问题,也不愿研究COM接口实现的黑魔法。