在java项目中调用c++的一个exe程序,在如何知道这个程序是否结束上产生了分歧,然后我也悲剧了(以为c++必须有个回值)
代码如下:
String path=Thread.currentThread().getContextClassLoader().getResource("").toString();
path=path.replace('/', '\\'); // 将/换成\
path=path.replace("file:", ""); //去掉file:
path=path.replace("classes\\", ""); //去掉class\
path=path.substring(1); //去掉第一个\,如 \D:\JavaWeb...
path+="Debug\\UseDPSDK.exe";
String message = "更新成功!";
response.setContentType("text/plain; charset=utf-8");
try {
Process proc = rn.exec(path);
proc.waitFor();
PrintWriter out = response.getWriter();
out.write(message);
out.flush();
out.close();
} catch (Exception e) {
System.out.println("Error exec!");
}
proc.waitFor();为我从新看了下Runtime之后加上的,之前为Thread.sleep(10000); 同事写了个睡眠(一个初级程序员)
--------------------------------------------------------
下面说下,我今天的请教:
问了c++(领导) 句柄
解答:windows最开始时没有对象这些东西,如何知道自己获取到了windows元素(比如窗口呢,java里面是会得到一个对象),这边就是句柄(说是一个数字之类的东西,比如1、2、3、4这种),其实java做了封装,不需要关注底层。
hook 钩子
解答:钩子类似回调函数,用来获取句柄
------------------------------------------------------------
题外话在网上查了精灵线程:
守护线程(精灵线程)是一类特殊的线程,它和普通线程的区别在于它并不是应用程序的核心部分,当一个应用程序的所有非守护线程终止运行时,即使仍然有守护线程在运行,应用程序也将终止,反之,只要有一个非守护线程在运行,应用程序就不会终止。守护线程一般被用于在后台为其它线程提供服务。
在java中,设置某线程为守护线程(精灵线程),可以通过方法setDaemon(booleanon)来实现。如果一个线程被设为守护线程或者用户线程,那么该线程处于后台运行,当主线程做完,那么整个程序就结束了,自然而然该线程也就结束了。需要强调的一点是该方法必须在启动线程前调用。
我们也可以通过isDaemon()方法来判断某一个线程是否是精灵线程。
import com.SepUserlist;
public class UserTimeOutThread extends Thread{
}
Java中,daemon thread与user thread相对,前者的活动不会阻止Java进程的结束,而后者必须全部运行结束后Java进程才可以结束。----------------------------------------------------------
再说下Runtime类吧,他是一个与JVM运行时环境有关的类,这个类是Singleton的。
1、Runtime.getRuntime()可以取得当前JVM的运行时环境,这也是在Java中唯一一个得到运行时环境的方法。
2、Runtime上其他大部分的方法都是实例方法,也就是说每次进行运行时调用时都要用到getRuntime方法。
3、Runtime中的exit方法是退出当前JVM的方法,估计也是唯一的一个吧,因为我看到System类中的exit实际上也是通过调用Runtime.exit()来退出JVM的,这里说明一下Java对Runtime返回值的一般规则(后边也提到了),0代表正常退出,非0代表异常中止,这只是Java的规则,在各个操作系统中总会发生一些小的混淆。
4、Runtime.addShutdownHook()方法可以注册一个hook在JVM执行shutdown的过程中,方法的参数只要是一个初始化过但是没有执行的Thread实例就可以。(注意,Java中的Thread都是执行过了就不值钱的哦)
5、说到addShutdownHook这个方法就要说一下JVM运行环境是在什么情况下shutdown或者abort的。文档上是这样写的,当最后一个非精灵进程退出或者收到了一个用户中断信号、用户登出、系统shutdown、Runtime的exit方法被调用时JVM会启动shutdown的过程,在这个过程开始后,他会并行启动所有登记的shutdown hook(注意是并行启动,这就需要线程安全和防止死锁)。当shutdown过程启动后,只有通过调用halt方法才能中止shutdown的过程并退出JVM。
那什么时候JVM会abort退出那?首先说明一下,abort退出时JVM就是停止运行但并不一定进行shutdown。这只有JVM在遇到SIGKILL信号或者windows中止进程的信号、本地方法发生类似于访问非法地址一类的内部错误时会出现。这种情况下并不能保证shutdown hook是否被执行。