我想通过一个JAVA程序去每隔一段时间就去检测下另外一个JAVA程序是否已经关闭,如果检测到关闭则马上开启关闭的java程序。而且我想把这个检测的java程序放到系统后台运行该怎么做?

解决方案 »

  1.   

    public class ShutdownHook extend Thread{
        public void run() {
            ......
        }
    }
    在你检测的java类中添加Runtime.getRuntime().addShutdownHook(new ShutdownHook())
      

  2.   


    1.楼主说的,另外一个JAVA程序是否已经关闭
    不知道是指什莫
    如果说是退出了jvm,那你用来监控的这个java程序肯定也是随之退出阿我想,你这个可能是监视另外一个java线程的运行状况吧
    这样的话,还可以实现2.如果检测到关闭则马上开启关闭的java程序
    如果发现线程已经终止执行,则不可以重新“开启”,就是说同一个线程不可以重复start
    只能重新创建线程对象,然后启动3.而且我想把这个检测的java程序放到系统后台运行该怎么做
    把检测线程设置为后台线程就可以了
      

  3.   

    上个代码楼主参考一下吧public class Test1 { /**
     * @param args
     */
    public static void main(String[] args) {
    // TODO Auto-generated method stub

    Watcher w = new Watcher();
    w.setDaemon(true);  //设置监视线程为后台线程
    w.start();   //启动监视线程
    }}class Watcher extends Thread{          //监视类

    boolean status = true;        //控制监视线程运行的变量
    void setStatus(boolean status){     //设置监视线程的运行与否
    this.status = status;
    }

    public void run(){
    Worker w = new Worker();     
    w.start();                 //启动被监视的线程

    while(status){
    if(!w.isAlive()){      //判断被监视的线程是否停止运行
    w = new Worker();   //新建一个被监视类的对象   
    w.start();         //启动被监视的线程
    }

    try {
    w.sleep(1000);     //间隔1秒检测被监视线程的运行状态
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    }
    }
      

  4.   

    不好意思,代码没有发全,重新贴一下
    public class Test1 {    /**
         * @param args
         */
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            
            Watcher w = new Watcher();
            w.setDaemon(true);  //设置监视线程为后台线程
            w.start();   //启动监视线程
        }}class Watcher extends Thread{          //监视类
        
        boolean status = true;        //控制监视线程运行的变量
        void setStatus(boolean status){     //设置监视线程的运行与否
            this.status = status;
        }
        
        public void run(){
            Worker w = new Worker();     
            w.start();                 //启动被监视的线程
            
            while(status){
                if(!w.isAlive()){      //判断被监视的线程是否停止运行
                    w = new Worker();   //新建一个被监视类的对象   
                    w.start();         //启动被监视的线程
                }
                
                try {
                    w.sleep(1000);     //间隔1秒检测被监视线程的运行状态
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }        
        }    
    }class Worker extends Thread{         //被监视的类
    public void run(){
       //some codes
    }
    }
      

  5.   

    我是这么个意思,就是在一个dos里面运行一个Java程序,这个程序是在公司的一个服务器里面跑,为了防止因为某种原因而让这个程序关闭了,所以我想在另外一个DOS下运行一个java程序,来监听前一个程序是否死掉如果死掉则执行一个启动它的bat文件,让它重新跑起来。
      

  6.   

    被监视者 A  监视者 B
    设置一个外部文件 比如日志 来标记状态  
    A在被关闭时改变这个状态
    B设置个定时器之类或者线程来取得这个状态
    不过A被关闭的情况很多 没实际做过 给个意见楼主参考下
      

  7.   


    前面说的很对,
    把检测线程设置为后台线程就可以了
    所有非后台进程都结束了,jvm就退出了啊,这个要当心
      

  8.   

    设监测方为A  被监测方为B
    如果可以修改被监测方的代码,或者被监测方是你们自己写的程序,那么可以这样做被监测方B每隔一段时间向A发送信息,如果A经过这段时间没有得到B发送的信息,则视B为可能关闭,可尝试向
    B发送信息,如果B没有回复,则确定关闭。启动B
     
      

  9.   

    谢谢大家我的已经好了,看来有好多东西不能光从网上下来就可以直接跑的还是需要自己去加写或者改点代码才可以,我看到有些他故意加个错误放到网上去,等你下了下来,还必须自己知道怎么去找到他故意放的那错误的地方才行,而且有些放的也不全只是一部分。感觉中国的开发人员对开源的意识还是没外国人那么强烈。我经常逛一些外国的BBS上面可以找到好多很有用的代码。呵呵
      

  10.   

    这个我有做过,我用的BAT文件,检查任务管理器里的程序是否存在,不存在则启动!
    至于调用这个BAT可以用windows的计划任务,也可以用楼主说的java,如果担心jvm挂了还是用计划任务吧!