上网查了查相关资料,然后自己整理了一下。
为了保险起见PORT方法打开了两个端口。
经测试还凑合!
- class InstanceContorl{
- java.nio.channels.FileLock lock = null;
- private boolean isRunning() throws java.io.IOException{
- final java.io.FileOutputStream fos = new java.io.FileOutputStream(new java.io.File("lock"));
- final java.nio.channels.FileChannel fc = fos.getChannel();
- final java.nio.channels.FileLock lock = fc.tryLock();
- if(lock == null){
- return true;
- }
- Runtime.getRuntime().addShutdownHook(new Thread(){
- public void run(){
- if(lock != null && lock.isValid()){
- try {
- lock.release();
- } catch (java.io.IOException ioe) {
- ioe.printStackTrace();
- }
- }
- try {
- fc.close();
- fos.close();
- } catch (java.io.IOException ioe) {
- ioe.printStackTrace();
- }
- }
- });
- return false;
- }
- public void controlByLockFile() {
- try {
- if(isRunning()) {
- System.exit(0);
- }
- } catch (java.io.IOException ioe) {
- ioe.printStackTrace();
- }
- }
- public void controlByLockPort() {
- new Thread() {
- public void run() {
- try {
- new java.net.Socket("127.0.0.1",65432);
- new java.net.Socket("127.0.0.1",45678);
- throw new RuntimeException("An instance already running!");
- } catch (RuntimeException re) {
- re.printStackTrace();
- System.exit(0);
- } catch(Exception e) {}
- new Thread() {
- public void run() {
- try {
- java.net.ServerSocket server = new java.net.ServerSocket(65432);
- while(true) {
- server.accept();
- }
- } catch (java.io.IOException ioe) {}
- }
- }.start();
- new Thread() {
- public void run() {
- try {
- java.net.ServerSocket server2 = new java.net.ServerSocket(45678);
- while(true) {
- server2.accept();
- }
- } catch (java.io.IOException ioe) {}
- }
- }.start();
- }
- }.start();
- }
- }
用法:
new InstanceContorl().controlByLockPort();
或者
new InstanceContorl().controlByLockFile();