一、为什么GUI是单线程化

传统的GUI应用程序通常都是单线程的。

1. 在代码的各个位置都须要调用poll方法来获得输入事件(这样的方式将给代码带来极大的混乱)

2. 通过一个“主事件循环(Main Event Loop)”来间接地运行应用程序的全部代码。

假设在主事件循环中调用的代码须要非常长时间才干运行完毕。那么用户界面就会“冻结”,直到代码运行完毕。这是由于仅仅有当运行控制权返回到主事件循环后,才干处理兴许的用户界面事件。

非常多尝试多线程的GUI框架的努力,最总都由于静态条件和死锁导致的稳定性问题,又回到单线程的时间队列模型的老路上。



1. 顺序事件处理

由于仅仅有唯一的线程在处理GUI任务。全部任务都不须要考虑并发且都是顺序运行,可是问题是假设在任务中运行时间过长,或导致兴许操作无法响应。(Android会提示Andorid Not Response异常)





2. Swing中的线程限制

GUI的单线程规则:组件与模型仅仅能在事件分派线程中被创建、改动和请求。

在Andorid中假设在子线程进行创建或者更新UI操作会抛出异常。

二、短期的GUI任务

GUI应用程序中,事件起源于事件线程。冒泡似得传递到达应用程序提供的监听器,假设是比較简单的改动颜色等,能够直接在事件线程中处理。

三、耗时GUI任务

由于GUI任务有线程限制,所以须要子线程处理耗时操作,通常最后还须要在子线程进行刷新。



1. 取消

2. 进度与完毕标识

3. SwingWorker

在Andorid中使用AsyncTask

四、共享数据模型

避免响应性的最简单的方式是初始化时一次性读取到内存中,这样须要考虑是否占用内存过多的问题。

1. 线程安全的数据模型

ConcurrentHashMap无法提供一致的数据快照。

CopyOnWriteArrayList同一时候获得线程安全性、一致性以及良好的响应性。

2. 分解数据模型

假设一个数据模型必须被多个线程共享,并且因为堵塞、一致性或复杂度等原因无法实现一个线程安全的模型时。能够考虑使用分解模型设计。

五、其它形式的单线程子系统

一些情况下无法避免同步或者死锁问题。比如:原生库(Native Library)要求、通过System.loadLibrary载入时。都必须放在同一个线程中运行。

将Future和newSingleThreadExecutor一起使用处理单线程可取消的任务。



《Java并发编程实战》第九章 图形用户界面应用程序界面 读书笔记的更多相关文章

  1. 《Java并发编程实战》第十章 避免活跃性危急 读书笔记

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/love_world_/article/details/27635333 一.死锁 所谓死锁: 是指两 ...

  2. 《Java并发编程实战》第八章 线程池的使用 读书笔记

    一.在任务与运行策略之间的隐性解耦 有些类型的任务须要明白地指定运行策略,包含: . 依赖性任务.依赖关系对运行策略造成约束.须要注意活跃性问题. 要求线程池足够大,确保任务都能放入. . 使用线程封 ...

  3. Java并发编程实战4章

    第4章主要介绍如何构造线程安全类. 在设计线程安全类的过程中,需要包含以下三个基本要素: 找出构成对象状态的所有变量. 找出约束状态变量的不变性条件. 建立对象状态的并发访问管理策略. 构造线程安全类 ...

  4. JAVA并发编程实战---第二章:线程安全性

    对象的状态是指存储在状态变量中的数据.对象的状态可能包括其他依赖对象的域.例如HashMap的状态不仅存储在HashMap本身,还存储在许多Map.Entry对象中.对象的状态中包含了任何可能影响其外 ...

  5. Java并发编程实战3章

    1.同步包括两方面:原子性和可见性. 2.可见性:因为在多线程程序中,如果没有采用正确的同步,有些线程就会得到失效数据. Java内存模型要求,变量的读取操作和写入操作都必须是原子操作,但对于非vol ...

  6. Java并发编程实战---第六章:任务执行

    废话开篇 今天开始学习Java并发编程实战,很多大牛都推荐,所以为了能在并发编程的道路上留下点书本上的知识,所以也就有了这篇博文.今天主要学习的是任务执行章节,主要讲了任务执行定义.Executor. ...

  7. Java并发编程实战——读后感

    未完待续. 阅读帮助 本文运用<如何阅读一本书>的学习方法进行学习. P15 表示对于书的第15页. Java并发编程实战简称为并发书或者该书之类的. 熟能生巧,不断地去理解,就像欣赏一部 ...

  8. 《Java并发编程实战》/童云兰译【PDF】下载

    <Java并发编程实战>/童云兰译[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230062521 内容简介 本书深入浅出地介绍了Jav ...

  9. 《java并发编程实战》笔记

    <java并发编程实战>这本书配合并发编程网中的并发系列文章一起看,效果会好很多. 并发系列的文章链接为:  Java并发性和多线程介绍目录 建议: <java并发编程实战>第 ...

随机推荐

  1. Notepad++源代码阅读——窗口封装与继承

    引言 近期在看Notepad++的源代码,学习学习Win32 原生API的开发技巧. 本文以Notepad++ 1.0版本的源代码为例讲解如何封装windows窗口,实现面向对象开发,如何通过窗口的继 ...

  2. 图解PCB布线数字地、模拟地、电源地,单点接地抗干扰!

    我们在进行pcb布线时总会面临一块板上有两种.三种地的情况,傻瓜式的做法当然是不管三七二十一,只要是地 就整块敷铜了.这种对于低速板或者对干扰不敏感的板子来讲还是没问题的,否则可能导致板子就没法正常工 ...

  3. 常用VPS测试工具整理

    来源: http://www.vpser.net/manage/vps-test-tool.html 购买VPS前主要是使用一些网络测试工具如ping.tracert.WinMTR之类的工具进行测试, ...

  4. 自定义圆形控件RoundImageView并认识一下attr

    昨天我们学习了自定义带图片和文字的ImageTextButton,非常简单,我承诺给大家要讲一下用自定义属性的方式学习真正的实现自定义控件,在布局文件中使用属性的方式就需要用到attr.xml这个文件 ...

  5. git 分支管理策略 与 物理实现 --author by阮一峰 & 小鱼

    -------------------------下面是阮一峰博士的git branch 逻辑结构图示---------------------------------------------- 如果 ...

  6. [PHP] ubuntu16.04配置Lamp环境(搭建linux+apache+mysql+php7环境)

    reference : http://blog.csdn.net/Abyss_sliver/article/details/77621404 好久没有在Linux环境下进行开发了,比较常用的还是win ...

  7. 树行控件TreeView 在WinForm下 怎么实现重命名功能

    public Form1() {     InitializeComponent();     this.Load+=new EventHandler(Form1_Load);     treeVie ...

  8. ILMerge-GUI的使用

    去这里下载: 这里下载ILMerge,http://www.microsoft.com/en-us/download/details.aspx?id=17630 这里下载ILMerge-GUI,htt ...

  9. 20个令人惊叹的音乐应用程序UI,值得收藏

    我们无法想象世界上没有手机.他们已经成为日常生活中不可缺失的一部分.今天的手机可以让你不只是拨打电话和发送消息.它可以让你浏览网页空间,拍照,看书,听音乐等等. 回顾一下互联网,你会看到不同的音乐AP ...

  10. 获取定位,苹果IOS10以上不支持h5的geolocation获取不到地理位置信息解决办法

    今天开发应用,获取地理位置,最先采用H5的Geolocation的方法来获取地理位置,经过测试发现安卓的机子可以,但是IOS的就是不行,一查资料才知道:10.0苹果版本需要协议为https的才可以获取 ...