多个Bash终端处理单个JVM实例

时间:2018-01-04 02:08:36

标签: java bash jar terminal jvm

我有一个Java程序,它将两个数字作为用户输入并打印总和。

如果30秒后没有输入任何输入,程序将终止。

Java代码如下:

public class task {

static double i1;
static double i2;
static boolean breakOut = false;

public static void main(String[] args) throws IOException{

    int x = 30; // time to wait, in seconds

    while(true) {
        boolean goodInput1 = false;
        while(!goodInput1) {
            BufferedReader in1 = new BufferedReader(new InputStreamReader(System.in));
            Date date = new Date();
            SimpleDateFormat ft = new SimpleDateFormat ("hh:mm:ss");
            System.out.print("Current time: " + ft.format(date));
            System.out.print(" Please enter the first number: ");
            long startTime = System.currentTimeMillis();
                while ((System.currentTimeMillis() - startTime) < x * 1000 && !in1.ready()) {}

            try {
                if (in1.ready()) {
                    i1 = Double.parseDouble(in1.readLine());
                    goodInput1 = true;
                } else {
                    date = new Date();
                    System.out.print("\nTime now is:  " + ft.format(date));
                    System.out.println(" You have not entered any number so exiting the program.");
                    breakOut = true;
                    break;
                }
            } catch (NumberFormatException e) {
                System.out.println("You have entered bad data, please try again.");
                continue;
            }
        }
        if(breakOut) { break; }

        boolean goodInput2 = false;         
        while(!goodInput2) {
            BufferedReader in2 = new BufferedReader(new InputStreamReader(System.in));
            Date date = new Date();
            SimpleDateFormat ft = new SimpleDateFormat ("hh:mm:ss");                
            System.out.print("Current time: " + ft.format(date));
            System.out.print(" Please enter the second number: ");
            long startTime2 = System.currentTimeMillis();
                while ((System.currentTimeMillis() - startTime2) < x * 1000 && !in2.ready()) {}
            try {
                if (in2.ready()) {
                    i2 = Double.parseDouble(in2.readLine());
                    goodInput2 = true;
                } else {
                    date = new Date();
                    System.out.print("\nTime now is:  " + ft.format(date));
                    System.out.println(" You have not entered any number, exiting the program.");
                    breakOut = true;
                    break;
                }
            } catch (NumberFormatException e) {
                System.out.println("You have entered bad data, please try again.");
                continue;
            }
        }
        if(breakOut) { break; }

    double sum = i1 + i2;
    System.out.println("The sum is " + sum);

    }

    System.out.println("Program Terminated.");

}

}

我将程序保存为Jar可执行文件。

我编写了一个脚本,用于检查我的Jar进程当前是否正在运行,如果不是,则启动该进程:

My Bash Script

这个脚本确保只有一个运行我程序的JVM实例存在,无论我尝试从多少个不同的Bash终端运行我的Jar。 (假设我只使用我的脚本来运行该过程)

最终目标是允许连接到单个JVM的任何终端,能够通过输入输入来重置30秒计时器。

我想更改脚本以实现此功能。 (更不用说对Java代码的更改)

我的问题是:

鉴于JVM是从一个Bash终端启动的,我如何允许其他终端获取该特定JVM实例的句柄?

2 个答案:

答案 0 :(得分:1)

从操作系统的角度来看,bash终端是一个进程,就像jvm进程一样,你尝试做的是进程间通信。

所以你必须修改java代码以支持进程间函数,例如socket或signal。

终端bash过程无法获得其他进程的能力。

答案 1 :(得分:0)

我最终使用ServerSocket / Socket作为解决方案。我为服务器安装了一个Jar,为客户端安装了一个Jar。第一个终端将运行Server Jar,以下终端将运行Client Jar。

单个JVM部分要求让我最为困惑,但最终,客户端 - 服务器解决方案是获得所需功能的方法。