Swing中的并发和多线程

看到很多地方讲述Swing中的并发和多线程问题,感觉讲的都不如Sun的教程,这里复述一下关键。Swing之所以和多线程紧密联系在一起是因为图形界面编程中如果只采取顺序编程(也就是你的代码或任务依次执行),会出现很大的问题,比如你要编写一个FTP客户端,你不能让文件下载的时候,用户界面死在那里,你既不能取消任务也不能和界面交互吧。所以有必要将耗时的任务,比如文件下载放到一个独立的线程中处理,而让用户同时能够干其他事情。简单来说,Swing中有三种线程:
  1. 启动线程或者初始线程: 这个线程负责调用main方法,很多顺序编程一开始就用的是这种线程。在Swing中启动线程负责很少的事务,主要干两件事情,第一件就是创建一个可运行的对象(Runnable Object),这个可运行对象的任务比较重要,它负责初始化图形界面,第二件就是将这个可运行对象安排到另外一个非常重要的线程,事件分派线程中执行。第二件事情是通过SwingUtilies的invokeLater和invokeAndWait方法来实现的。几乎所有的创建Swing组件和与Swing组件交互的代码都要在事件分派线程中执行。
  2. 事件分派线程:在Swing中负责事件处理的代码需要在一个特定的线程中运行,这个线程就是事件分派线程。大部分调用Swing方法的代码也在这个线程中运行。原因是大部分Swing对象中的方法并不是线程安全的,所以需要这个特定的事件分派线程来保证线程安全。当然也有部分swing对象中的方法指明是线程安全的,这些方法可以在任何线程中调用。你可以将事件分派线程中运行的代码想象成一系列短小的任务,大部分任务都是调用事件处理方法,例如ActionListener.actionPerformed()方法,其他任务可被程序代码通过SwingUtilities的invokeLater/invokeAndWait方法来安排。需要注意的是,在事件分派线程中的任务必须短小精悍,这意味着这些任务能够很快执行完毕,如果你发现有一个耗时的任务,那么你肯定出错了,你会发现你的图形界面经常被卡住,或者死掉了。对于耗时任务你需要另外一个线程,例如工作线程(Worker Thread)来处理。判断你的代码时候运行在事件分派线程上的方法很简单,使用javax.swing.SwingUtilities.isEventDispatchThread()方法即可。
  3. 工作线程(Worker Thread)或者后台线程(Background Thread):你可以在这个线程中处理耗时任务。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值