从swing分发线程机制上理解多线程[转载]
本文参考了 http://space.itpub.net/13685345/viewspace-374940,原文作者:javagui
在多线程编程当中,总会提到图形编程,比如java中的swing,并一再提出,在swing中,一切都是单线程的。所有的界面更新操作都必须在排 队似地进行。这样的目的在于,避免由于多线程的处理导致界面渲染以及组件排列异常,同时也避免了由于多线程带来的加锁访问以及等待锁的情况发生。
EventQueue的派发机制由单独的一个线程管理,这个线程称为事件派发线程(EDT)”。和其他很多桌面API一样,Swing将GUI请求放入一个事件队列中执行。
这个可以这样来理解,界面上所有的操作,包括点击按钮,编辑文字等。这些操作都会产生一系列的事件,而这些事件均按钮一定的顺序(通常是事件发生的顺序)
依次的插入到事件队列中。而分线线程则按照顺序从事件队列中依次一个一个地取出事件对象,并调用事件的相应方法来运行处理事件的方法。
在整个处理阶段,分发线程必须要等到一个事件处理方法运行结束之后,才会处理下一个事件。在这个过程中,肯定有些事件处理得快,比如普通的点击按钮改变颜
色的这种操作;而有些事件则会非常的慢,比如点击按钮运行一个长时间的数据压缩。我们希望,处理得慢的事件在处理时不致于影响其它事件的处理。
这就需要使用其它线程来处理这些耗时地任务,比如使用一个新的线程来处理这些耗时任务。这样可以处理处理事件的程序快速地返回,而不至于影响其它事件的执行。但是在处理过程中,我们必须保证处理的代码不能影响到界面的变化。主要依赖于以下的原则:
EDT要处理所有GUI操作,它是职责分明且非常忙碌的。也就是说你要记住两条原则:一、职责分明,任何GUI请求都应该在EDT中调用。二、需要处理的
GUI请求非常多,包括窗口移动、组件自动重绘、刷新,它很忙,所以任何与GUI无关的处理不要由EDT来负责,尤其是I/O这种耗时的操作。
那么,如果我们要在我们新建的线程中,要调用界面处理程序应该如何去做呢。这时可以使用SwingUtilities工具类的invokeLater或者
invokeAndWait方法来执行界面更新程序。这两个方法,是将我们传递的一个线程方法放入到事件分发线程当中,这样可保证所有更新界面的程序都能
够在事件处理线程中运行。
由于invokeLater和invokAndWait方法是在事件分发线程中运行的,所以这两个方法不能在事件分发线程中调用,特别是
invokeAndWait方法,这会导致线程死锁。所幸的是,jdk的invokeAndWait实现避免了这种情况,如果在事件处理线程中调用
invokeAndWait,那会产生一个异常。
说到底,什么是事件处理线程呢,什么才算在事件处理线程当中呢。很简单的理解,我们添加到各个对象上的listener实现中的处理代码,都是在事件处理
线程中运行的。比如按钮的点击事件处理程序,actionPerformed方法,这都是在事件处理线程中调用的。
通过上述对事件队列和EDT的分析,有这样一种体会:事件队列是一个非常好的处理并发设计模型,不仅
Swing用它来处理后台,Java的很多地方都在用,只不过对于处理服务器端的并发请求有多个处理线程在等候处理请求,也就是常说的线程池。而对于单用
户的桌面应用,单线程调用要比多现成API更简单,“Swing后台这样做是为了保证事件的顺序和可预见性”,而且相对于服务器,客户端桌面层的请求要少
得多,所以单线程就足够应对了。
那么,swing的分发线程机制和多线程之间有什么联系呢?swing中的线程处理原则在于,界面处理程序在事件处理线程中运行,而其它逻辑运算在其它线
程中运行,通过invokeLator和invokeAndWait和事件处理线程交互。而我们通过使用的多线程,在一定程度上也是这样处理。主要的程序
处理在主线程中运行,当接收到处理请求时,则分发线程进行,即要保证主线程不会因为事件处理而被阻塞,同时也要保证事件都能够被处理。比如经常使用的
web开发中的socket请求。
转载 http://www.iflym.com/index.php/code/201108110001.html
从swing分发线程机制上理解多线程[转载]的更多相关文章
- 深入浅出Java多线程(2)-Swing中的EDT(事件分发线程) [转载]
本系列文章导航 深入浅出Java多线程(1)-方法 join 深入浅出Java多线程(2)-Swing中的EDT(事件分发线程) 深入浅出多线程(3)-Future异步模式以及在JDK1.5Concu ...
- 浏览器UI多线程及JavaScript单线程运行机制的理解
在上一篇博客中,我对jQuery的队列(queue)机制和动画(animate)机制做了一个深入的解析,在animate的实现机制其核心是依靠queue来完成的,其中在jQuery的链式调用部分,之前 ...
- cpu个数、核数、线程数、Java多线程关系的理解
cpu个数.核数.线程数.Java多线程关系的理解 2017年12月08日 15:35:37 一 cpu个数.核数.线程数的关系 cpu个数:是指物理上,也及硬件上的核心数: 核数:是逻辑上的,简单理 ...
- swing线程机制
在介绍swing线程机制之前,先介绍一些背景概念. 背景概念 同步与异步: 同步是指程序在发起请求后开始处理事件并等待处理的结果或等待请求执行完毕,在此之前程序被阻塞(block)直到请求完成 ...
- Java多线程与并发库高级应用-传统线程机制回顾
1.传统线程机制的回顾 1.1创建线程的两种传统方式 在Thread子类覆盖的run方法中编写运行代码 // 1.使用子类,把代码放到子类的run()中运行 Thread thread = new T ...
- 从原理上理解NodeJS的适用场景
NodeJS是近年来比较火的服务端JS平台,这一方面得益于其在后端处理高并发的卓越性能,另一方面在nodeJS平台上的npm.grunt.express等强大的代码与项目管理应用崛起,几乎重新定义了前 ...
- Java并发编程与技术内幕:线程池深入理解
摘要: 本文主要讲了Java当中的线程池的使用方法.注意事项及其实现源码实现原理,并辅以实例加以说明,对加深Java线程池的理解有很大的帮助. 首先,讲讲什么是线程池?照笔者的简单理解,其实就是一组线 ...
- 线程机制、CLR线程池以及应用程序域
最近在总结多线程.CLR线程池以及TPL编程实践,重读一遍CLR via C#,比刚上班的时候收获还是很大的.还得要多读书,读好书,同时要多总结,多实践,把技术研究透,使用好. 话不多说,直接上博文吧 ...
- 线程安全(上)--彻底搞懂volatile关键字
对于volatile这个关键字,相信很多朋友都听说过,甚至使用过,这个关键字虽然字面上理解起来比较简单,但是要用好起来却不是一件容易的事.这篇文章将从多个方面来讲解volatile,让你对它更加理解. ...
随机推荐
- Tkinter Anchors(锚)
Python GUI - Tkinter Anchors: 锚是用来定义文本的相对位置参考点 锚是用来定义文本的相对位置参考点. 这里是锚属性可以使用的常数列表. NW N NE W CENTER ...
- python+selenium+Firefox+pycharm版本匹配
window(2018-05-29)最新 python:3.6.1 地址https://www.python.org/downloads/release/python-361/ selenium ...
- 华为OJ机试题目:两个大整数相乘(纯C语言实现两个大整数相乘,两种方法实现大数相乘)
题目描述: 输出两个不超过100位的大整数的乘积. 输入: 输入两个大整数,如1234567 123 输出: 输出乘积,如:151851741 样例输入: 1234567 123 样例输出: 1518 ...
- 关于Web项目出现懒加载异常的解决方案
manytomany关系中,使用 fetch = FetchType.LAZY 来做懒加载,加快些性能.但是却一直出错,原因是session被关闭,要保持session,需要事务. Hibernate ...
- MySQL内置功能之事务、函数和流程控制
主要内容: 一.事务 二.函数 三.流程控制 1️⃣ 事务 一.何谓事务? 事务用于将某些操作的多个SQL作为原子性操作,一旦有某一个出现错误,即可回滚到原来的状态,从而保证数据库数据完整性. # ...
- Scala开发Hadoop示例
import org.apache.hadoop.conf.{Configuration, Configured}; import org.apache.hadoop.util.{ToolRunner ...
- 新手C#ListView使用记录2018.08.03
在使用C#的ListView时,感觉有一些部分需要自己注意. ListView1.Clear()这条指令在使用时,用于Click后在ListView中显示数据,应该放在输入数据的前面. 在ListVi ...
- web前端整套面试题(三)--网易的面试题
题型分析: 一.选择题部分(30分) 元素出栈可能性 排序方法的优缺点 HTTP请求方法 关系型数据库种类 多线程(进程与线程共享) 计算机网络协议 linux指令 JQuery实现方法 二.编程题( ...
- python3企业微信群组报警
公司提出一个需求需要做一个企业微信的一个消息推送,需要将消息发送到聊天群里详细信息如下. 如何创建应用请阅读我的上篇文章:https://www.cnblogs.com/wangyajunblog/p ...
- css实现文本过长时自动添加省略号
1. 效果 2. Html <div id="main_app_content" class="container"> <div class= ...