我想用参数运行我的程序的单个实例,并且我已经成功完成了。当我使用参数运行第二个实例时,它不会执行和关闭,因为前一个实例正在运行。但是,我每次都必须传递参数,所以如何将参数传递给处于运行状态的原始实例。我必须传递这样的论点: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;
}
}
答案 0 :(得分:0)
没有直接预先实现的方法来执行此操作。大多数程序所做的是允许" New"实例,但然后搜索"原始"实例并以某种方式传递参数。这两个问题 - 找到现有任务和传递参数 - 都没有解决,你可以选择你的实现。
一种方法是让第一个实例开始创建一个文件(也许是一个包含它的文件&PID;)。第二个进程可能会查找该文件,找到它并将新值写入该文件然后退出。您的第一个必须查看文件以获取更新并读取新值。
另一种方法是在启动时打开固定端口。如果您无法打开端口,假设已经有一个实例正在运行,请连接到该端口并发送新参数。
答案 1 :(得分:-1)
我使用SQL解决了我的问题。