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

网友投稿 314 2023-06-04


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

大概思路:

写两个程序,一个负责重启的程序,一个是待重启的程序,在这里为了区分我们假设负责重启的那个程序叫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 sqlkdYPsewIK = "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();

}

}

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Vue实现自带的过滤器实例
下一篇:Vue 父子组件、组件间通信
相关文章

 发表评论

暂时没有评论,来抢沙发吧~