我的代码利用Jacob来调用outlook, 但是发现一些问题:在调用Dispatch.call(oNameSpace, "Logoff"); 程序退出后,outlook 进程仍然运行在后台。我有写了个简短的测试程序如下,发现可能是程序退出清理资源的问题。
如下这段代码是运行正确的,但加了System.exit(0) 这句话就会出现上述问题:outlook 进程仍然运行在后台。
单步运行调试发现,不加 System.exit(0);时, 程序最后会运行 Thread.exit()进行资源清理; 但执行System.exit(0);的话, Thread.exit()就不会执行,所以我相信问题出现的原因就是Thread.exit()的清理工作没有运行。
但是我的程序里必须执行System.exit(0), 我的问题就是如何执行Thread.exit()的清理工作。public static void main(String asArgs[]) throws Exception {
System.out.println("Outlook: IN");
//Dispatch oOutlook; ActiveXComponent axOutlook = new ActiveXComponent("Outlook.Application");
try {

System.out.println("version=" + axOutlook.getProperty("Version")); Dispatch oOutlook = axOutlook.getObject();
System.out.println("version=" + Dispatch.get(oOutlook, "Version")); Dispatch oNameSpace = axOutlook.getProperty("Session").toDispatch();
Dispatch.call(oNameSpace, "Logon");
System.out.println("oNameSpace=" + oNameSpace);

recurseFolders(0, oNameSpace);
Dispatch.call(oNameSpace, "Logoff");
//System.exit(0); } finally {
//axOutlook.invoke("Logoff", new Variant[] {});
//Dispatch.call(oOutlook, "Logoff");
}
}下面是Thread.exit()代码,请问大家这个问题有什么解决办法, 或者有什么建议, 怎样做 Thread.exit()的工作呢?
/**
     * This method is called by the system to give a Thread
     * a chance to clean up before it actually exits.
     */
    private void exit() {
if (group != null) {
    group.remove(this);
    group = null;
}

解决方案 »

  1.   

    把System.exit(0);换成return试一试。
    我想没有什么程序非要用System.exit(0);结束不可。
    而且编程的时候通常是不在成使用System.exit(0)来终止程序的。
      

  2.   

    你都推出虚拟机了,还调Thread.exit有什么用,这个线程随着虚拟机的关闭,线程也就没有了
      

  3.   

    我还有其他几个线程同时在跑, 在用户点击界面的关闭按钮时,我就调用 System.exit(),但这时java没有执行thread.exit.
    如果我调用return, 程序是没法退出的.
      

  4.   


    虚拟机都退出了,该虚拟机下的线程也就都没有了。所以也没必要调用thread.exit
      

  5.   

    首先楼主对问题的定位是否准确?
    如果真的是由于那个线程的exit方法所引起的。
    当需要程序退出的时候,楼主可以先创建一个新的线程,并将要结束的这个线程对象设置成新线程的成员变量中。
    然后,运行新线程。新线程的功能就是监视成员变量线程是否已经被销毁了。如果已经被销毁了,说明已经执行完了exit方法。
    这个时候,在新县城里面执行那个System.exit(0)方法。