深入浅出Java多线程(2)-Swing中的EDT(事件分发线程)
时间:2010-12-09 advincenting
本文主要解决的问题是:
如何使其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多线程(2)-Swing中的EDT(事件分发线程)(2)
时间:2010-12-09 advincenting
如果在启动一个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,真的吗?
由于我没有做过Swing的项目,仅仅做过个人用的财务管理小软件,还没有深 入理解过EDT,不管怎么说先把那段逻辑加到EDT,
怎么加呢 用SwingUtilities
static void invokeAndWait(Runnable doRun)
Causes doRun.run() to be executed synchronously on the AWT event dispatching thread.
static void invokeLater(Runnable doRun)
Causes doRun.run() to be executed asynchronously o
|