如何将参数传递给已经运行的java程序

时间:2018-06-08 06:54:22

标签: java swing

我想用参数运行我的程序的单个实例,并且我已经成功完成了。当我使用参数运行第二个实例时,它不会执行和关闭,因为前一个实例正在运行。但是,我每次都必须传递参数,所以如何将参数传递给处于运行状态的原始实例。我必须传递这样的论点:java -jar JARFILE.jar 123456

public class MainFrame extends JFrame {

static JFrame jf;

    public static void main(String args[]) {

        RuntimeMXBean rt = ManagementFactory.getRuntimeMXBean();
        final int runtimePid = Integer.parseInt(rt.getName().substring(0, 
         rt.getName().indexOf("@")));

        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {

                try {
                    // If exists another instance, show message and terminates the current instance.
                    // Otherwise starts application.
                    if (getMonitoredVMs(runtimePid)) {
                        MainFrame mf = new MainFrame();
                        mf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                        mf.setSize(400, 400);
                        mf.setTitle(String.valueOf(System.currentTimeMillis()));
                        mf.setLocationRelativeTo(null);
                        mf.setVisible(true);
                    } else {

                        JOptionPane.showMessageDialog(null, "There is another instance of this application running.");
                    }
                } catch (URISyntaxException ex) {
                    Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex);
                }

            }
        });
    }

    private static boolean getMonitoredVMs(int processPid) throws URISyntaxException {
        MonitoredHost host;
        Set vms;
        try {
            host = MonitoredHost.getMonitoredHost(new HostIdentifier((String) null));
            vms = host.activeVms();
        } catch (MonitorException mx) {
            throw new InternalError(mx.getMessage());
        }
        MonitoredVm mvm = null;
        String processName = null;
        try {
            mvm = host.getMonitoredVm(new VmIdentifier(String.valueOf(processPid)));
            processName = MonitoredVmUtil.commandLine(mvm);
            processName = processName.substring(processName.lastIndexOf("\\") + 1, processName.length());
            mvm.detach();
        } catch (Exception ex) {
            ex.printStackTrace();
        }

        for (Object vmid : vms) {
            if (vmid instanceof Integer) {
                int pid = ((Integer) vmid).intValue();
                String name = vmid.toString(); // default to pid if name not available  
                try {
                    mvm = host.getMonitoredVm(new VmIdentifier(name));
                    // use the command line as the display name  
                    name = MonitoredVmUtil.commandLine(mvm);
                    name = name.substring(name.lastIndexOf("\\") + 1, name.length());
                    mvm.detach();
                    if ((name.equalsIgnoreCase(processName)) && (processPid != pid)) {
                        return false;
                    }
                } catch (Exception x) {
                    // ignore  
                }
            }
        }
        return true;
    }
}

2 个答案:

答案 0 :(得分:0)

没有直接预先实现的方法来执行此操作。大多数程序所做的是允许" New"实例,但然后搜索"原始"实例并以某种方式传递参数。这两个问题 - 找到现有任务和传递参数 - 都没有解决,你可以选择你的实现。

一种方法是让第一个实例开始创建一个文件(也许是一个包含它的文件&PID;)。第二个进程可能会查找该文件,找到它并将新值写入该文件然后退出。您的第一个必须查看文件以获取更新并读取新值。

另一种方法是在启动时打开固定端口。如果您无法打开端口,假设已经有一个实例正在运行,请连接到该端口并发送新参数。

答案 1 :(得分:-1)

我使用SQL解决了我的问题。