我的代码利用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;
}
如下这段代码是运行正确的,但加了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;
}
我想没有什么程序非要用System.exit(0);结束不可。
而且编程的时候通常是不在成使用System.exit(0)来终止程序的。
如果我调用return, 程序是没法退出的.
虚拟机都退出了,该虚拟机下的线程也就都没有了。所以也没必要调用thread.exit
如果真的是由于那个线程的exit方法所引起的。
当需要程序退出的时候,楼主可以先创建一个新的线程,并将要结束的这个线程对象设置成新线程的成员变量中。
然后,运行新线程。新线程的功能就是监视成员变量线程是否已经被销毁了。如果已经被销毁了,说明已经执行完了exit方法。
这个时候,在新县城里面执行那个System.exit(0)方法。