从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,让你对它更加理解. ...
随机推荐
- eclipse中导入web项目时,出现转不了项目类型的问题解决方案
解决步骤: 1.进入项目目录,可看到.project文件,文本编辑器打开. 2.找到<natures>...</natures>代码段,加入如下标签内容并保存: <nat ...
- python中的json的基本使用方法
在python中使用json的时候,主要也就是使用json模块,json是以一种良好的格式来进行数据的交互,从而在很多时候,可以使用json数据格式作为程序之间的接口, #!/usr/bin/env ...
- 正则表达式RE与扩展正则表达式ERE——grep与egrep
grep 正则表达式规则: ^ 行首定位符,表示从行首开始进行模式匹配 . 一个非换行符的字符 [ ] 匹配属于此集合的任意一个字符 [^ ] 匹配不属于此集合的任意一个字符 [a-z] (其指定的集 ...
- Eclipse的Java Working set
1. 在 java perspective 点击 package explorer 的 倒三角 ,选择 Configurate Working Sets 新建Working Sets 或者 在 pac ...
- mybatis 传入集合参数遍历 查询总结
出自:http://blog.csdn.net/u013628152/article/details/51184641 1. findByIds(List ids) 如果参数的类型是List, 则在使 ...
- kali中的中国菜刀weevely
weevely是一个kali中集成的webshell工具,是webshell的生成和连接集于一身的轻量级工具,生成的后门隐蔽性比较好,是随机生成的参数并且加密的,唯一的遗憾是只支持php,weevel ...
- UNITY IMGUI
这几天研究OPENGL时,想找一个UI库来用,发现了IMGUI,到网上搜索评估中,突然发现它似乎和UNITY有关系. UNITY文档中提到过IMGUI,不知道是不一个东西,仔细看了下文档,果然是.原文 ...
- jquery ui的css设计
jquery ui 是当前最强大的UI库之一,其两大卖点是对IE6的良好支持与换肤功能.为了构建avalon ui,今天起我将投入一部分精力来研究时下最流行的几个CSS框架.它是首当其冲. jquer ...
- Linux重置管理员密码
对于一些非专业的Linux运维工程师或者偶尔使用Linux系统的学习者而言,比如我,经常会碰到忘记密码的尴尬,那这时候,快速的重置密码就相当重要了.废话不多说,今天我们就一起来学习一下如何快速重置密码 ...
- 刷题向》一道关于位运算的神题(BZOJ3668)(HARD-)
个人觉得这道题对于位运算的加深理解很有意义 根据题目所说,我们要求出一个在给定范围里的自变量,使得最终结果最大. 那么因为这道题是针对于位运算的,所以可以想到用对于位运算取极限情况,即对于“0”和“( ...