我有一个奇怪的问题,使用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(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
答案 0 :(得分:1)
我没有使用最新版本的JACOB及其新的线程模型,但旧版本肯定 不 线程安全。从版本1.7开始>他们改进了线程模型以更好地反映底层COM组件,但您必须确定所述组件是MTA还是STA,然后适当地初始化JACOB类。请参阅JACOB documentation了解如何根据需要正确调整应用程序。
答案 1 :(得分:0)
当我开始将相同的线程名称设置为多个线程时,我开始遇到类似的问题(第一次执行ok,第二次失败,无法共同创建对象)。添加序号作为线程名称的后缀为我解决了问题。