让Java程序只运行一个实例(两种方法都好用)

上网查了查相关资料,然后自己整理了一下。

为了保险起见PORT方法打开了两个端口。

经测试还凑合!

  1. class InstanceContorl{
  2.     java.nio.channels.FileLock lock = null;
  3.     private boolean isRunning() throws java.io.IOException{
  4.         final java.io.FileOutputStream fos = new java.io.FileOutputStream(new java.io.File("lock"));
  5.         final java.nio.channels.FileChannel fc = fos.getChannel();
  6.         final java.nio.channels.FileLock lock = fc.tryLock();
  7.         if(lock == null){
  8.             return true;
  9.         }
  10.         Runtime.getRuntime().addShutdownHook(new Thread(){
  11.             public void run(){
  12.                 if(lock != null && lock.isValid()){
  13.                     try {
  14.                         lock.release();
  15.                     } catch (java.io.IOException ioe) {
  16.                         ioe.printStackTrace();
  17.                     }
  18.                 }
  19.                 try {
  20.                     fc.close();
  21.                     fos.close();
  22.                 } catch (java.io.IOException ioe) {
  23.                     ioe.printStackTrace();
  24.                 }
  25.             }
  26.         });
  27.         return false;
  28.     }
  29.     
  30.     public void controlByLockFile() {
  31.         try {
  32.             if(isRunning()) {
  33.                 System.exit(0);
  34.             }
  35.         } catch (java.io.IOException ioe) {
  36.             ioe.printStackTrace();
  37.         }
  38.     }
  39.     
  40.     public void controlByLockPort() {
  41.         new Thread() {
  42.             public void run() {
  43.                 try {
  44.                     new java.net.Socket("127.0.0.1",65432);
  45.                     new java.net.Socket("127.0.0.1",45678);
  46.                     throw new RuntimeException("An instance already running!");
  47.                 } catch (RuntimeException re) {
  48.                     re.printStackTrace();
  49.                     System.exit(0);
  50.                 } catch(Exception e) {}
  51.                 
  52.                 new Thread() {
  53.                     public void run() {
  54.                         try {
  55.                             java.net.ServerSocket server = new java.net.ServerSocket(65432);
  56.                             while(true) {
  57.                                 server.accept();
  58.                             }
  59.                         } catch (java.io.IOException ioe) {}
  60.                     }
  61.                 }.start();
  62.                 new Thread() {
  63.                     public void run() {
  64.                         try {
  65.                             java.net.ServerSocket server2 = new java.net.ServerSocket(45678);
  66.                             while(true) {
  67.                                 server2.accept();
  68.                             }
  69.                         } catch (java.io.IOException ioe) {}
  70.                     }
  71.                 }.start();
  72.             }
  73.         }.start();
  74.     }
  75. }
  76.                     

用法:

new InstanceContorl().controlByLockPort();

或者

new InstanceContorl().controlByLockFile();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值