今天在给同事改程序的时候,发现了java中Runtime

在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()方法来判断某一个线程是否是精灵线程。

 

 package socket;
import com.SepUserlist;

public class UserTimeOutThread extends Thread{
 private SepUserlist sepUserlist=newSepUserlist();
 public UserTimeOutThread(){
  this.setDaemon(true);//必须在调用start()方法之前调用
  start();
 }
 public void run(){ 

 //该线程需要做的工作,在这儿是设置每隔5分钟进行一次扫描
  while(true){

   try{
    super.sleep(300000);
   }catch(Exceptione){
    System.out.println(e.toString());
   }
   System.out.println("searchuser");
   sepUserlist.TravelVector(SocketConstant.name);  
  }
 

}

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是否被执行。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值