深入浅出Java多线程(2)-Swing中的EDT(事件分发线程)

    本文主要解决的问题是:如何使其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();  }    当代码获得锁后:我们试图编辑这个文件是就会:

    如果在启动一个Java 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,真的吗?

以上是 深入浅出Java多线程(2)-Swing中的EDT(事件分发线程) 的全部内容, 来源链接: utcz.com/p/206410.html

回到顶部