Java操作另一个Java程序使其重启的简单实现
程序员文章站
2024-03-05 15:52:49
大概思路:
写两个程序,一个负责重启的程序,一个是待重启的程序,在这里为了区分我们假设负责重启的那个程序叫a,待重启的程序叫b,他们都是线程,还要搭配数据库,他是两个程序...
大概思路:
写两个程序,一个负责重启的程序,一个是待重启的程序,在这里为了区分我们假设负责重启的那个程序叫a,待重启的程序叫b,他们都是线程,还要搭配数据库,他是两个程序的桥梁,通过设置信号量进行判断程序状态(不妨设置信号量为flag),我是这么设置的,0:表示程序正在运行中,1:表示程序需要重启,正准备做关闭自己的操作(只针对待重启的程序b),2:表示b程序已经把自己给关闭了,需要a程序把b程序启动。
实现步骤:
a程序:写一个线程进行读信号量flag,当flag为2的时候就把b程序启动
b程序:写一个线程进行读信号量flag,当flag为1的时候就把自己给关闭(java system.exit(0);)
数据库:需要一个表存flag的值,创建表restart,并新建一个字段flag,int(4)nonull
实现细节:
a 程序:
package com.app; import java.io.ioexception; import java.sql.resultset; import java.sql.sqlexception; import databasetool.dbtool; public class restart implements runnable { int status = 0; public void run() { dbtool con = new dbtool(); resultset rs = null; string select = "select * from restart"; string restar = "update restart set status = '0'";// 准备启动程序,设置status为0,表示已启动 try { int result = con.executeupdate(restar); system.out.println("初始化,并将status状态设置为0,表示程序正常被启动了!"); } catch (sqlexception e) { e.printstacktrace(); } while (true) { while (true) { if (status == 2) {// 2:表示关闭的程序等待重启 system.out.println("status状态为2,表示需要重新启动数采程序!"); try { int result = con.executeupdate(restar); system.out.println("程序马上就被启动,并将status状态设置为0,表示程序正常运行!"); } catch (sqlexception e) { e.printstacktrace(); } string cmd = "cmd /c start e:\\bats\\mainthread.bat";// pass try { process ps = runtime.getruntime().exec(cmd); ps.waitfor(); } catch (ioexception ioe) { ioe.printstacktrace(); } catch (interruptedexception e) { e.printstacktrace(); } } try { rs = con.executequery(select); while (rs.next()) { status = rs.getint("status"); system.out.println("检测当前状态status:"+status); } } catch (sqlexception e) { e.printstacktrace(); } try { thread.sleep(5000); } catch (interruptedexception e) { e.printstacktrace(); } } } } public static void main(string[] args) { restart res = new restart(); res.run(); } }
b程序:
package datacollect; import java.sql.resultset; import java.sql.sqlexception; import databasetool.dbtool; public class exitmain implements runnable { @override public void run() { dbtool dbtool = new dbtool(); int status = 0;// 0:表示不需要重启 resultset rs = null; string select = "select * from restart"; string restar = "update restart set status = '2'";// 关闭了程序,等待重启 // 写日志相关内容 while (true) { try { rs = dbtool.executequery(select); while (rs.next()) { status = rs.getint("status"); } } catch (sqlexception e) { e.printstacktrace(); } if (status == 1) {// 1:表示等待关闭程序 system.out.println("status状态为1,表示需要关闭当前程序!"); try { int result = dbtool.executeupdate(restar); system.out.println("程序马上就被关闭,并将status状态设置为2,表示程序关闭了,需要重启!"); } catch (sqlexception e) { e.printstacktrace(); } system.exit(0); } try { thread.sleep(5000); } catch (interruptedexception e) { // todo auto-generated catch block e.printstacktrace(); } } } public static void main(string[] args) { exitmain extm = new exitmain(); extm.run(); } }
数据库读取工具类:
package databasetool; import java.sql.connection; import java.sql.drivermanager; import java.sql.resultset; import java.sql.sqlexception; import java.sql.statement; public class dbtool { private connection connection = null; public statement statement = null; private resultset result = null; public dbtool() { try { class.forname("com.microsoft.sqlserver.jdbc.sqlserverdriver"); string url = "jdbc:sqlserver://localhost:1433;databasename=tianjincollect;user=sa;password=123456"; connection = drivermanager.getconnection(url); statement = connection.createstatement(); } catch (sqlexception ex) { system.out.println(ex.getmessage()); } catch (classnotfoundexception ex) { system.out.println(ex.getmessage()); } } public resultset executequery(string sql) throws sqlexception { try { result = statement.executequery(sql); } catch (sqlexception se) { system.out.println("error:" + se.getmessage()); } return result; } public int executeupdate(string sql) throws sqlexception { int updatenum = 0; try { updatenum = statement.executeupdate(sql); return updatenum; } catch (sqlexception se) { system.out.println("error:" + se.getmessage()); } return updatenum; } public void free() throws sqlexception { try { if (result != null) result.close(); if (statement != null) statement.close(); if (connection != null) connection.close(); } catch (sqlexception se) { system.out.println("error:" + se.getmessage()); } } public static void main(string[] args) { dbtool con = new dbtool(); resultset rs = null; string sql = "select * from restart"; try { rs = con.executequery(sql); while(rs.next()){ int status = rs.getint("status"); system.out.println(status); } } catch (sqlexception e) { e.printstacktrace(); } sql = "update restart set status = '1'"; try { int result = con.executeupdate(sql); } catch (sqlexception e) { e.printstacktrace(); } } }
以上这篇java操作另一个java程序使其重启的简单实现就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
上一篇: Java程序中的延迟加载功能使用