Chinaunix首页 | 论坛 | 博客
  • 博客访问: 628107
  • 博文数量: 796
  • 博客积分: 5000
  • 博客等级: 大校
  • 技术积分: 5095
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-10 09:43
文章分类

全部博文(796)

文章存档

2011年(1)

2008年(795)

我的朋友

分类:

2008-09-10 10:05:57

    本文主要解决的问题是:如何使其Swing程序只能运行一个实例?

    抛开Swing, 我们的程序是通过java 命令行启动一个进程来执行的,该问题也就是说要保证这个进程的唯一性,当然如果能够访问系统的接口,得到进程的信息来判断是否已有进程正在运行,不就解决了吗?但是如何访问系统的接口呢?如何要保证在不同的平台上都是OK的呢?我的思路是用文件锁,当然我相信肯定有更好的方法,呵呵,希望读者能够指出。

    文件锁是JDK1.4 NIO提出的,可以在读取一个文件时,获得文件锁,这个锁应该是系统维护的,JVM应该是调用的系统文件锁机制,例子如下:

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
/**
 *
 * 
@author vma
 
*/
public class temp1 {
  
public static void main(String args[]) throws FileNotFoundException, InterruptedException, IOException{
    RandomAccessFile r 
= new RandomAccessFile("d://testData.java","rw");
    FileChannel temp 
= r.getChannel();
    FileLock fl 
= temp.lock();
    System.out.println(fl.isValid());
    Thread.sleep(
100000);
    temp.close();
  }
    当代码获得锁后:我们试图编辑这个文件是就会:



    如果在启动一个 Main方法时:
public class temp2 {
  
public static void main(String args[]) throws FileNotFoundException, InterruptedException, IOException{
    RandomAccessFile r 
= new RandomAccessFile("d://testData.java","rw");
    FileChannel temp 
= r.getChannel();
    FileLock fl 
= temp.tryLock();
    System.out.println(fl
== null);
    temp.close();。

    返回的结束是 ture , 也就是得不到文件的锁。

    这就是对于进程唯一性问题我的解决思路,通过锁定文件使其再启动时得不到锁文件而无法启动。

    说到这里,跟今天Swing中的EDT好像还没有关系,对于Swing程序,Main方法中一般像这样:

  public static void main(String[] args) {
    
try {
      UIManager.setLookAndFeel(UIManager
          .getCrossPlatformLookAndFeelClassName());
    } 
catch (Exception e) {
    }

    
//Create the top-level container and add contents to it.
    JFrame frame = new JFrame("SwingApplication");
    SwingApplication app 
= new SwingApplication();
    Component contents 
= app.createComponents();
    frame.getContentPane().add(contents, BorderLayout.CENTER);

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack();
    frame.setVisible(
true);

    启动Jframe后,Main线程就退出了,上面获得文件锁,并持有锁的逻辑往哪里写呢? 有人会说事件分发线程EDT,真的吗?

[1]    

【责编:Chuan】

--------------------next---------------------

阅读(267) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~