读书人

Java:同一个程序与此同时只能启动一个

发布时间: 2012-09-21 15:47:26 作者: rapoo

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");

? ? }

}

?

转自:http://www.cppblog.com/biao/archive/2010/12/23/137254.html

?

读书人网 >编程

热点推荐