快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-23

深入浅出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(事件分发线程) - 编程入门网

深入浅出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

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号