博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何让程序(如java Hello)只启动一次?
阅读量:4574 次
发布时间:2019-06-08

本文共 1688 字,大约阅读时间需要 5 分钟。

如何让程序(如java Hello)只启动一次?

摘自http://bbs.csdn.net/topics/50488704

 

总结一下,关于让Java程序只运行一个实例的问题,其实质是JVM之间通信的问题。楼上的单例模式显然是没有作用的。

应该使用文件锁来锁定一个代表程序运行实例的文件,当程序启动时,首先锁定该文件,后继启动的实例一旦发现该文件已被锁定则提示出错信息。(为什么不直接使用文件而是使用文件锁来判断呢?即:在程序启动的时候生成一个文件而在程序退出时删除这个文件,只要判断该文件的存在与否就可以判断实例的运行情况。这是因为我们不能确保删除文件的操作一定能被执行到,程序是可能被强制关闭或异常退出的,而文件锁不同,它是作为系统资源分配给JVM的,一旦JVM当掉,其资源会一并被操作系统回收,因此对文件的锁定也会被消除。)

 

1 package packa; 2  3 import java.nio.channels.*; 4 import java.io.*; 5  6  //应用实例控制类 7 public class InstanceControl 8 { 9     private static FileLock lock = null;10 11     //判断该应用是否已启动12     public static boolean isRunning()13     {14         try15         {16             //获得实例标志文件17             File flagFile = new File(".lock");18             19             //如果不存在就新建一个20             if(!flagFile.exists())21                 flagFile.createNewFile();22             23             //获得文件锁24             lock = new FileOutputStream(flagFile).getChannel().tryLock();25             26             //返回空表示文件已被运行的实例锁定27             if(lock==null)28                 return false;29         }30         catch(Exception ex)31         {32             ex.printStackTrace();33         }34         return true;35     }36 37     public static void main(String[] args)38     {39         if (isRunning())40         {41             System.out.println("xxxxxxxxxxxxxxxxxx");42             try43             {44                 Thread.sleep(100000);45             }46             catch (Exception e)47             {48                 e.printStackTrace();49             }50         }51         else52             System.out.println("xxxxxxxx.....xxxxxxxxxx");            53     }54 }

 

转载于:https://www.cnblogs.com/LiuYanYGZ/p/6226433.html

你可能感兴趣的文章
Unable to instantiate receiver xxx.receiver.NetworkReceiver异常
查看>>
C++调用C#类库函数
查看>>
vs2013编译项目去掉warning信息
查看>>
ASP.NET MVC html help
查看>>
C# 时间比较方法DateTime.Compare
查看>>
三级菜单小练习
查看>>
vim 插件管理
查看>>
Guid函数
查看>>
java的加减乘除问题
查看>>
Android 系统常用的权限
查看>>
类型参数约束 : Controller where T : class,new()
查看>>
N卡控制面板把physx设置为cpu
查看>>
Javsssist用InsertAt()方法对语句插桩
查看>>
java安装Jboss插件
查看>>
宝塔apache配置
查看>>
shell脚本中使用nohup执行命令不生效
查看>>
PHP 文件上传七牛云
查看>>
ZT:Unity与C++之间进行socket通信
查看>>
Ural 1517. Freedom of Choice 后缀数组
查看>>
【转载】Maven入门实践
查看>>