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

王朝java/jsp·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

如果要使一个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次运行的时候自动退出虚拟机的。

简单吧!

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航