Java:同一个程序同时只能启动一个实例

Java:同一个程序同时只能启动一个实例

import java.io.File;

import java.io.RandomAccessFile;

import java.nio.channels.FileChannel;

import java.nio.channels.FileLock;


public class SingleApplication {

    // 在应用程序的main方法里调用此函数保证程序只有一个实例在运行.

    public static void makeSingle(String singleId) {

        RandomAccessFile raf = null;

        FileChannel channel = null;

        FileLock lock = null;


        try {

            // 在临时文件夹创建一个临时文件,锁住这个文件用来保证应用程序只有一个实例被创建.

            File sf = new File(System.getProperty("java.io.tmpdir") + singleId + ".single");

            sf.deleteOnExit();

            sf.createNewFile();


            raf = new RandomAccessFile(sf, "rw");

            channel = raf.getChannel();

            lock = channel.tryLock();


            if (lock == null) {

                // 如果没有得到锁,则程序退出.

                // 没有必要手动释放锁和关闭流,当程序退出时,他们会被关闭的.

                throw new Error("An instance of the application is running.");

            }

        } catch (Exception e) {

            e.printStackTrace();

        }

    }


    public static void main(String[] args) throws Exception {

        SingleApplication.makeSingle("single.test"); // 保证程序只有一个实例在运行.


        // 测试: 模拟一个程序正在运行5秒

        System.out.println("Start");

        System.out.println("Waiting 5 seconds.");


        for (int i = 0; i < 5; ++i) {

            Thread.sleep(1000);

            System.out.println((i + 1) + "......");

        }


        System.out.println("End");

    }

}

你可能感兴趣的:(Java:同一个程序同时只能启动一个实例)