如何使java Application只有一个实例运行

       如果要使一个java Application只能运行一个实例。大多数会考虑使用JNDI技术来在命名空间中邦定特定的对象来做到该功能。

在windows下c开发的时候,这样的事情是很容易的,只需要创建一个信号量就可以了。

本文就是通过java的JNI技术来利用windows的信号内核对象的,从而非常容易的能控制一个java运行实例的数量的。

至于JNI技术就不多说了。

1。首先编写如下的java代码:/**方便起见,将所有的代码放在一个目录下

public class singleApp{

 public native boolean findExsit();///native method

 static
 {
  System.loadLibrary("singleApp");///load the native library
 }

 public static void main(String []args)
 {
  boolean res=new singleApp().findExsit();

  if(res)
  {
   System.out.println("find an instance");
   System.exit(0);
  }
  else
  {
   System.out.println("this is no one exsit!");
  }
  while(true)
  {
   
  }
 }

}

使用javac 编译得到类文件。

2.得到C的头文件

使用javah工具得到如下的头文件:singleApp .h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class singleApp */

#ifndef _Included_singleApp
#define _Included_singleApp
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:   singleApp
 * Method:   findExsit
 * Signature: ()Z
 */
JNIEXPORT jboolean JNICALL Java_singleApp_findExsit
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

3.编辑c源文件:singleApp .cpp

#include <jni.h>
#include <windows.h>
#include <stdio.h>
#include <singleApp.h>

 

JNIEXPORT jboolean JNICALL Java_singleApp_findExsit
  (JNIEnv *, jobject){
  CreateSemaphore(NULL, 1, 1, "singleApp"); //创建信号量
 if (GetLastError() == ERROR_ALREADY_EXISTS)//如果该信号量存在
  return 1;
 else ///如果不存在
  return 0;

}

然后使用C++编译器编译得到dll文件

我是使用的borland公司的c++命令行工具编译的。注意的java载入库的时候是使用的singleApp名字,所以我们的dll名字也要是一样的名字,就是singleApp.dll.

还要注意的该dll要放在java的类载入器能找到的地方,比如classpath指定的地方。

4.运行java程序

java singleApp

然后再开一个console窗口,运行该java程序,第2次运行的时候自动退出虚拟机的。

简单吧!

 

 

Java实例应用是指只能在同一时间内启动一个实例的应用程序。这通常用于确保应用程序的稳定性和避免出现冲突等问题。要启动一个Java实例应用程序,需要以下步骤: 1. 在应用程序中使用标准的Java类库中的ServerSocket类创建一个服务端Socket,这个Socket将监听特定的端口。 2. 在应用程序的启动代码中,尝试连接到该端口。如果端口已经被占用,说明已经有一个实例运行,此时需要退出应用程序。 3. 如果端口没有被占用,则说明当前没有运行实例,将继续执行应用程序的主逻辑。 4. 当应用程序关闭时,需要释放Socket并关闭连接。 以下是一个简单的Java实例应用程序的示例代码: ```java import java.io.IOException; import java.net.ServerSocket; public class SingleInstanceApp { private static final int PORT = 12345; public static void main(String[] args) { try { ServerSocket serverSocket = new ServerSocket(PORT); System.out.println("The application is listening on port " + PORT); // 尝试连接到端口 serverSocket.accept(); System.out.println("The application is already running"); serverSocket.close(); } catch (IOException e) { System.out.println("Starting the application"); // 实现应用程序主逻辑 } } } ``` 上面的代码通过ServerSocket实现了Java实例应用程序,监听了指定的端口并在应用程序启动时自动连接,如果连接失败则说明该端口上不存在运行实例,将执行应用程序的主逻辑。如果连接成功,则说明已经有一个实例运行,直接退出应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值