zoukankan      html  css  js  c++  java
  • java程序怎么在一个电脑上只启动一次,只开一个进程

    目录

    linux文件锁flock

    NIO文件锁FileLock

    java程序怎么在一个电脑上只启动一次,只开一个进程

    方案1:

    单进程程序可以用端口绑定。程序启动的时候可以尝试看该端口是否已经被占用,如果占用则程序已经启动。

    方案2:
    你可以在java程序中创建一个隐藏文件,程序退出的时候删除这个文件。这样在程序启动的时候,你判断是否存在这个文件,如果存在说明已经启动。

    import java.io.File;
    import java.io.IOException;
    import java.io.RandomAccessFile;
    import java.nio.channels.FileLock;
    
    /**
     * FileLockManager 文件锁管理
     *
     */
    public class FileLockManager {
    
        private FileLock fileLock = null;
    
        private File file = null;
    
        private RandomAccessFile randomAccessFile = null;
    
        public FileLockManager(String fileName) {
            this.file = new File(fileName);
        }
    
        public FileLockManager(File file) {
            this.file = file;
        }
    
        /**
         * 文件加锁并创建文件
         * 
         * @return
         * @throws IOException
         */
        public boolean Lock() throws IOException {
            if (!this.file.exists()) {
                this.file.createNewFile();
                this.randomAccessFile = new RandomAccessFile(this.file, "rw");
                this.fileLock = this.randomAccessFile.getChannel().tryLock();
                if (this.fileLock.isValid()) {
                    return true;
                } else {
                    return false;
                }
    
            } else {
                return false;
            }
    
        }
    
        /**
         * 解锁并删除文件
         * 
         * @return
         * @throws IOException
         */
        public boolean unLock() throws IOException {
            if (!this.file.exists()) {
                return true;
            } else {
                if (this.fileLock != null) {
                    this.fileLock.release();
                }
                if (this.randomAccessFile != null) {
                    this.randomAccessFile.close();
                }
                if (this.file.delete()) {
                    return true;
                } else {
                    return false;
                }
    
            }
    
        }
    
        /**
         * @return Returns the fileLock.
         */
        public FileLock getFileLock() {
            return this.fileLock;
        }
    
        /**
         * @param fileLock
         *            The fileLock to set.
         */
        public void setFileLock(FileLock fileLock) {
            this.fileLock = fileLock;
        }
    
    }
  • 相关阅读:
    Python 内存泄露 内存回收机制
    decimal 格式化
    iis 6 配置PHP
    按照 in (....) 里面的顺序进行排序
    设计模式之 访问者模式
    与数据库的列信息有关
    win32 IFolderView2::GetCurrentFolderFlags的使用
    MySQL防止重复插入相同记录 insert if not exists
    c++扩展Python(未验证)
    c++ 获取桌面图标的坐标与名称
  • 原文地址:https://www.cnblogs.com/duanxz/p/5019501.html
Copyright © 2011-2022 走看看