如果希望你的Java程序只能存在一个实例,可以参考下面的用法。

  原文链接:http://blog.csdn.net/yaerfeng/article/details/7264729

  

  Java没有提供这样的机制。从操作系统的观点来看,一个启动的Java Application仅仅是一个JVM的运行实例。运行相同Application的两个实例,仅仅是运行两个无关的JVM。
       只有让多个运行实例之间有一个既定的通讯机制就可以保证只有一个实例运行。

  方案1:使用Java的加锁文件机制,idea相当简单,让运行实例通过java.nio.channels.FileLock获得一个"well-known"文件的互斥锁  

import java.io.*;
import java.nio.channels.*;
public class OneInstance_1 {
public static void main(String[] args) throws Exception {
FileLock lck = new FileOutputStream("C:\\flagFile").getChannel().tryLock();
if(lck == null) {
System.out.println("A previous instance is already running....");
System.exit(1);
}
System.out.println("This is the first instance of this program...");
// Do some work here.....
}
}

  问题:平台相关

  方案2:使用java.net.ServerSocket

import java.io.*;
import java.net.*;
public class OneInstance_2 {
private static ServerSocket listenerSocket;
public static void main(String[] args) {
try {
listenerSocket = new ServerSocket(2004);
//At this point, no other socket may listen on port 2004.
} catch(java.net.BindException e) {
System.err.println("A previous instance is already running....");
System.exit(1);
} catch(final IOException e) { // an unexpected exception occurred
System.exit(1);
}
// Do some work here.....
}
}

  问题:打开服务端口可能会受到防火墙的影响;可能和别的端口冲突

  方案3:使用File.createNewFile() and File.deleteOnExit()

import java.io.*;
public class OneInstance_3 {
public static void main(String[] args) throws Exception {
File flagFile = new File("C:\\flagFile");
if(false == flagFile.createNewFile()) {
System.out.println("A previous instance is already running....");
System.exit(1);
}
flagFile.deleteOnExit();
System.out.println("This is the first instance of this program...");
// Do some work here.....
} }

  来源:·BBS 水木清华站 smth.org·[FROM: 202.108.130.*]

  问题:文件可能因为某些原因不能被删除,即使利用Runtime.addShutdownHook()也有可能产生这种情况。

Java程序只运行一个实例[转]的更多相关文章

  1. vc++高级班之窗口篇[4]---让程序只运行一个实例

      大家都看过或者使用过类似只运行一个实例的程序,比如:QQ游戏.部分浏览器 等等! 让一个程序只运行一个实例的方法有多种,但是原理都类似,也就是在程序创建后,有窗口的程序在窗口创建前, 检查系统中是 ...

  2. VC 实现程序只运行一个实例,并激活已运行的程序

    转载:http://blog.sina.com.cn/s/blog_4b44e1c00100bh69.html 进程的互斥运行:CreateMutex函数实现只运行一个程序实例 正常情况下,一个进程的 ...

  3. C#让应用程序只运行一个实例的几种方法

    一 判断是否有相同的实例已经运行 1 根据“Mutex”判断是否有相同的实例在运行 /// <returns>已有实例运行返回true,否则为false</returns>pu ...

  4. [VC]在VC++中实现让程序只运行一个实例的方法且实现该实例

    方法一: 有时候在开发应用程序时,希望控制程序运行唯一的实例.例如,最常用的mp3播放软 件Winamp,由于它需要独占计算机中的音频设备,因此该程序只允许自身运行唯一的一个例程.在Visual C+ ...

  5. VC程序只运行一个实例,并在打开多个时激活原窗口

    (一)单文档应用程序   1.在应用程序类C~~App::InitInstance()函数中判断是否已有一个应用程序实例正在运行 BOOL C~~App::InitInstance() {     . ...

  6. Winform(C#)限制程序只运行一个实例

    C#控制只运行开启一个程序 在这个例子中不需要调用ReleaseMutex,mutex会在程序结束时自动释放.为了防止mutex过早释放,在程序的最后调用下GC.KeepAlive (mutex). ...

  7. 让程序只运行一个实例(Delphi篇)(三种方法,其中使用全局原子的方法比较有意思)

    Windows 下一个典型的特征就是多任务,我们可以同时打开多个窗口进行操作,也可以同时运行程序的多个实例,比如可以打开许多个资源管理器进行文件的移动复制操作.但有时出于某种考虑(比如安全性),我们要 ...

  8. WPF程序只运行一个实例

    1.WPF程序在 启动窗口的构造函数执行InitializeComponent之前判断是否已经存在实例 不涉及服务器情况,可直接进行判断(不在mainwindow的构造函数中判断) // public ...

  9. 关于WPF程序只运行一个实例的方法

    找到的方法有两种: 1)http://www.cnblogs.com/liuyazhou/archive/2009/11/02/1594364.html 2)http://codereview.sta ...

随机推荐

  1. hdu_1711Number Sequence(kmp)

    Number Sequence Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  2. vuex的使用及持久化state的方式

    Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. 当我们接触vuex的时候,这是我们最先看到 ...

  3. C#的LINQ

    在过去如果我们如果需要去查询某些集合或者数组里面的某些元素,我们需要写出大量的带有筛选的遍历集合的代码,但是有了Linq之后,我们就不用写出那些冗余麻烦的遍历代码,只需要关注其中的筛选,排列的函数就可 ...

  4. 浅析const、let与var

    以前无论声明变量还是常量,总是使用var一勺端,知道接触了es6之后,发现原来变量.常量的声明其实是很讲究的. 这里简单来谈谈var.const与let. 1.var.var声明的变量没有块级作用域, ...

  5. .22-浅析webpack源码之事件流compilation总览

    呃,终于到了这地方-- newCompilation(params) { // ... this.applyPlugins("this-compilation", compilat ...

  6. ArcGIS中实现指定面积蜂窝(正六边形)方法

    本篇博文为博主(whgiser)原创,转载请注明. 空间聚集研究中,地理尺度大多数都是基于格网构建的,只需fishnet下就行了.也常有使用社区.交通小区(TZ)作为研究单元的.直到发现蜂窝网络做出的 ...

  7. Javascript闭包入门(译文)

    前言 总括 :这篇文章使用有效的javascript代码向程序员们解释了闭包,大牛和功能型程序员请自行忽略. 译者 :文章写在2006年,可直到翻译的21小时之前作者还在完善这篇文章,在Stackov ...

  8. addTarget:self 的意思是说,这个方法在本类中

    addTarget:self 的意思是说,这个方法在本类中也可以传入其他类的指针*/

  9. Oracle问题之ORA-01031权限不足

    Oracle问题之ORA-01031权限不足 此时应该按照如下写: sqlplus /nolog conn / as sysdba shutdown immediate 本地以sysdba身份登录数据 ...

  10. 强大的Cmder

    why 漂亮,包装并美化了各个shell 带task功能,能记忆,能执行脚本 配合win10的bash,能实现类似xshell的功能 注意点 需要注意的一点,Cmder来源于另外一个项目ConEmu, ...