我使用jni使用专有的dll,无论如何我需要在关机时手动释放资源。 我尝试使用shutdownhooks,但如果我不调用我的方法来释放这些资源,这些资源通过netbeans或每个taskmanager杀死java时发生,java.exe仍然存活。 我甚至无法用taskmanager杀死它(访问被拒绝)。 是否有另一种安全方法可以确保在processkill或其他不安全退出后调用免费资源方法?
编辑:
感谢您的第一个答案,但它并没有解决我的问题。如果我在睡眠呼叫期间杀死程序,它将无法正常关闭。但如果我等了5秒钟,它就会正常关闭。
我认为调用“AdsCallDllFunction.adsPortOpen()”正在为清理注册一些内容,如果进程被终止,java.exe将保持大约5-10分钟,直到jvm死亡。
import de.beckhoff.jni.tcads.AdsCallDllFunction;
import de.beckhoff.jni.tcads.AdsVersion;
/**
*
* @author Christian
*/
public class KillTest {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
long port = 0;
if (port == 0) {
AdsVersion lAdsVersion = null;
port = AdsCallDllFunction.adsPortOpen();
}
System.out.println("runs through this");
/**
* If i call the following function, it can exit.
**/
//AdsCallDllFunction.adsPortClose();
try {
/**
* If i kill the program during this sleep call, it wont exit for a timespan of 5-10 minutes
*/
Thread.sleep(5000);
} catch (InterruptedException ex) {
}
System.exit(0);
}
}
编辑2:
http://i.stack.imgur.com/4Vh71.png
对于自己的研究,您可以在http://www.beckhoff.com/下载twincat 3。 DLL和jar文件在C:\ TwinCAT \ AdsApi \ AdsToJava中提供。
我认为dll尝试与在twincat 3设置上安装的twincat 3驱动程序进行通信。 但是如果你试图通过任务管理器在5秒休眠时间内杀死java,程序就会卡住。
答案 0 :(得分:0)
从Java 7开始,您可以使用try-with-resources语句,以确保在语句结束时关闭需要最终关闭的每个已使用(已打开)资源。有关更多信息,请查看此处: http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html