当前位置: 首页 > news >正文

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


一、为什么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一起使用处理单线程可取消的任务。


转载于:https://www.cnblogs.com/lxjshuju/p/6931698.html

相关文章:

  • Spark RDD概念学习系列之Pair RDD的transformation操作
  • linux 不常用命令及命令组合
  • 面试基础_03实现strcpy、strcat、strcmp、strlen
  • Python学习之路12☞模块与包
  • 移动端页面的适配
  • Sql 列转行字符串
  • 团队冲刺阶段二(八)
  • Oracle解锁scott账户
  • SonarQube Scanner的配置与使用简介
  • 深度学习主机环境配置: Ubuntu16.04+GeForce GTX 1080+TensorFlow
  • JAVA EE Demo[购物商城 Strust2]
  • java之内部类
  • html5 Web Workers.RP
  • TensorFlow 生成 .ckpt 和 .pb
  • salesforce 简单的PDF报价单打印
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • 2017-09-12 前端日报
  • Django 博客开发教程 16 - 统计文章阅读量
  • emacs初体验
  • If…else
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • Objective-C 中关联引用的概念
  • php ci框架整合银盛支付
  • Spark RDD学习: aggregate函数
  • 关于extract.autodesk.io的一些说明
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 删除表内多余的重复数据
  • 使用agvtool更改app version/build
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • 《码出高效》学习笔记与书中错误记录
  • Hibernate主键生成策略及选择
  • ​渐进式Web应用PWA的未来
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • $(function(){})与(function($){....})(jQuery)的区别
  • (175)FPGA门控时钟技术
  • (八十八)VFL语言初步 - 实现布局
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (算法)求1到1亿间的质数或素数
  • (五)关系数据库标准语言SQL
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (转)C#调用WebService 基础
  • (转)四层和七层负载均衡的区别
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • .NET Core Web APi类库如何内嵌运行?
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?
  • .net访问oracle数据库性能问题
  • .NET开源项目介绍及资源推荐:数据持久层
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递
  • .NET下的多线程编程—1-线程机制概述
  • [【JSON2WEB】 13 基于REST2SQL 和 Amis 的 SQL 查询分析器
  • [<MySQL优化总结>]
  • [Android]常见的数据传递方式
  • [AutoSar NVM] 存储架构
  • [BUUCTF]-PWN:wustctf2020_number_game解析(补码,整数漏洞)