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

原创 2003年02月24日 09:06:00

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

简单吧!

 

 

eclipse中运行时java application与javaee run on server 他们分别的作用

run java application 是运行 java main方法run on server是启动一个web 应用服务器 两者的区别: Eclipse中可以创建j...
  • Yasha009
  • Yasha009
  • 2016年07月28日 09:02
  • 2293

(application)javaweb中application的用法

application对象 1 什么是application对象 ? (1) 当Web服务器启动时,Web服务器会自动创建一个application对象。application对象一旦创建,它将一...
  • jiafuwei520
  • jiafuwei520
  • 2015年03月18日 21:58
  • 19608

网络爬虫,java属性,可以直接运行java application

  • 2014年07月15日 11:16
  • 632KB
  • 下载

IntelliJ IDEA 运行你的第一个Java应用程序

IntelliJ IDEA 运行你的第一个Java应用程序创建项目让我们创建一个简单的Java Hello World项目。单击创建新的项目。打开新建项目向导。你应该注意的主要是项目的SDK。SDK(...
  • testcs_dn
  • testcs_dn
  • 2016年06月30日 22:03
  • 52827

如何让Java程序只运行一个实例

Java没有提供这样的机制。从操作系统的观点来看,一个启动的Java Application仅仅是一 个JVM的运行实例。运行相同Application的两个实例,仅仅是运行两个无关的JVM。 只...
  • yaerfeng
  • yaerfeng
  • 2012年02月16日 15:20
  • 6745

如何让应用程序只有一个实例运行

可以使用互斥体Mutex类型完成此功能。见如下代码:    [STAThread]    public static void Main(string[] args)     {         //...
  • dunesand
  • dunesand
  • 2004年08月05日 13:53
  • 890

linux shell 确保脚本只有一个运行实例

同时存在多个运行实例对数据进行修改时候会造成很多令人困惑的问题。我们可以在脚本执行开始前创建一个临时文件,如果此文件存在,就表示系统中存在一个运行实例,每个实例在退出之前把临时文件删除,保证新的实例可...
  • carbon06
  • carbon06
  • 2017年12月26日 12:10
  • 63

Python - 让程序只运行一个实例

Python - 让程序只运行一个实例
  • liuyuan_jq
  • liuyuan_jq
  • 2011年04月28日 13:23
  • 2174

如何使Shell脚本只有一个实例在运行

LOCKFILE=/tmp/lock.txt if [ -e ${LOCKFILE} ] && kill -0 `cat ${LOCKFILE}`; then echo "already ru...
  • butterfly5211314
  • butterfly5211314
  • 2017年01月21日 11:44
  • 360

Java 只运行一个实例

查了一下资料,Java 只运行一个实例的方法有下面三种: 1、占用端口(有效,但是有端口被挪用的缺陷) 2、检查文件是否存在(有效,但突然停机可能有问题) 3、使用JNI(有效,但丧失可移植性)...
  • huangng
  • huangng
  • 2017年07月02日 21:09
  • 143
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何使java Application只有一个实例运行
举报原因:
原因补充:

(最多只允许输入30个字)