Java操作另一个Java程序使其重启的简单实现

时间:2021-05-20

大概思路:

写两个程序,一个负责重启的程序,一个是待重启的程序,在这里为了区分我们假设负责重启的那个程序叫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程序使其重启的简单实现就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章