我有一个奇怪的问题,使用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

有帮助吗?

解决方案

我没有使用最新版本的jacob与它的新线程模型,但旧版本绝对是 线程安全。从1.7版本中,它们改进了线程模型以更好地反映底层的COM组件,但必须确定所述组件是MTA还是STA,然后适当地初始化Jacob类。请参阅 jacob文档如何根据其要求正确调整应用程序。

其他提示

我已经开始体验了类似的问题(第一次执行确定,第二个失败,无法共同创建对象),当我开始将相同的线程名称设置为多个线程时。将序号添加为thread name的后缀修复了我的问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top