所有的事件处理都在Event Dispatch Thread(EDT)上进行,此一类事件模型通常叫做单线程模型。

这种模型规定所有对组件的访问操作必须在EDT 上完成。

为什么对于组件的访问需要在EDT 上完成?这主要是为了保证对于组件状态的改变是同步的,保证了界面组件的可确定性。这种模型是大部分图形用户界面工具采用的模型,包括Swing/AWT、SWT、GTK、WinForm 等等.

?

这种模型的好处是,结构设计和代码实现都比较简单,避免了为了实现线程同步的复杂处理。

但是也带来了一些问题,最常见的问题是,程序员容易将长时间复杂任务的处理放在事件处理函数完成,造成EDT 线程被阻塞,给用户造成界面失去响应的错觉。

?

其实人们对于Swing 速度慢和反映迟钝的感觉大部分来源于此,简单的说,是程序员的问题,而不是Swing 自身的问题,是因为程序员没有理解这种事件处理机制造成的。

其实在SWT、GTK、WinForm 等任何以这种事件模型为基础的工具都会出现。

重现的方法就是你简单的将长时间处理的任务放在事件处理函数中,你的用户界面就会失去响应。

如何解决这种问题?

通用的办法就是采用异步线程处理长时间任务。

但是还要记住的是,在这种任务中对于界面的更新要采用SwingUtilities.invokeLater 或者在SWT 采用Synchronize 方法,将访问操作放到EDT 上进行。

?

?示例

?

?示例代码

class="java">package test;

import java.awt.BorderLayout;

import java.awt.EventQueue;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JPanel;

import javax.swing.SwingUtilities;

import javax.swing.border.EmptyBorder;

import javax.swing.JButton;

import java.awt.event.ActionListener;

import java.awt.event.ActionEvent;

public class Frame1 extends JFrame {

private static final long serialVersionUID = 1L;

private JPanel contentPane;

/**

* Launch the application.

*/

public static void main(String[] args) {

EventQueue.invokeLater(new Runnable() {

public void run() {

try {

Frame1 frame = new Frame1();

frame.setVisible(true);

} catch (Exception e) {

e.printStackTrace();

}

}

});

}

/**

* Create the frame.

*/

public Frame1() {

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

setBounds(100, 100, 450, 300);

contentPane = new JPanel();

contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));

contentPane.setLayout(new BorderLayout(0, 0));

setContentPane(contentPane);

final JLabel label = new JLabel();

contentPane.add(label, BorderLayout.CENTER);

JButton btnNewButton = new JButton("按钮");

contentPane.add(btnNewButton, BorderLayout.SOUTH);

btnNewButton.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

label.setText("开始执行...");

//耗时操作,新启线程去处理,但是外观的改变,仍需要放到EDT去执行。

Thread thread = new Thread() {

@Override

public void run() {

try {

//更新外观

SwingUtilities.invokeLater(new Runnable(){

public void run() {

label.setText("正在执行耗时任务...");

}

});

// 模拟耗时操作

Thread.sleep(5*1000);

//更新外观

SwingUtilities.invokeLater(new Runnable(){

public void run() {

label.setText("耗时任务执行完毕");

}

});

} catch (Exception e2) {

e2.printStackTrace();

}

}

};

thread.start();

}

});

}

}

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

大小: 3.3 KB

查看图片附件

java 事件分发线程_事件分发线程EDT相关推荐

  1. python强制暂停线程_如何暂停线程(python)

    上下文: 我正在用Qt creator和python中的"behavior"文件构建一个图形界面.我的GUI的测试版本是: 预期行为: 我正在运行两个不同的线程,它们被引用到同一个 ...

  2. java中的事件派发机制_事件派发器模式

    在项目开发中,会遇到如下情形:我们自己的服务订阅.接收来自消息队列或者客户端的事件和请求,基于不同的事件采取对应的行动,这种情况下适合应用派发器模式. 主要模块 XXXEventDispatcher类 ...

  3. java bean 监听_事件监听器?将JavaBeans接通起来的方法

    摘 要 JavaBeans 通 过 事 件( 封 装 着 与 所 发 生 情 况 有 关 的 数 据 的 对 象) 与 其 它 软 件 组 件 进 行 通 讯. 本 文 将 向 你 展 示 如 何 利 ...

  4. java 事件分发机制_用两段代码带你看懂事件分发机制

    先来看一段精简版的源码 View.java public class View { private View.OnClickListener mOnClickListener; private OnL ...

  5. java 事件分发机制_读Android源码之事件分发机制最全总结

    原标题:读Android源码之事件分发机制最全总结 本文源码来自andorid sdk 22,不同版本会有细微差别,但核心机制是一致的 一.概述 事件分发有多种类型, 本文主要介绍Touch相关的事件 ...

  6. Android系统--输入系统(八)Reader线程_使用EventHub读取事件

    Android系统--输入系统(八)Reader线程_使用EventHub读取事件 1. Reader线程工作流程 获得事件 size_t count = mEventHub->getEvent ...

  7. 工作流 节点子线程_节点JS体系结构–单线程事件循环

    工作流 节点子线程 Today we will look into Node JS Architecture and Single Threaded Event Loop model. In our ...

  8. java最少有多少线程_【并发编程】一个最简单的Java程序有多少线程?

    一个最简单的Java程序有多少线程? 通过下面程序可以计算出当前程序的线程总数. import java.lang.management.ManagementFactory; import java. ...

  9. Qt线程、事件与QObject

    线程.事件与QObject 敬告:测试版本 原文连接:http://m.blog.csdn.net/blog/shang322/9344475# 本译文接近定稿,但还须一些加工和更好的例子.欢迎任何评 ...

最新文章

  1. python 下载大文件
  2. 在i386平台Linux 2.6 上实现一个系统调用
  3. UITextFile
  4. C++学习-环境配置
  5. greenPlum资源隔离
  6. 6000个边缘Kubernetes节点驱动城市80万次智能停车,如何成为可能?
  7. label里面的文字换行_批量识别图中文字自动命名,让你1秒找到骚图!太强大了!...
  8. linux windows 动态库导出查看 ld -r
  9. Java反射机制demo(五)—获得并调用一个类中的方法
  10. DQL 学习2 -- DQL声明
  11. UVA12032 The Monkey and the Oiled Bamboo【序列处理】
  12. vue前端项目打包并且在服务器上部署过程
  13. cboard使用方法以及用户交互的两种方式
  14. 论文代码复现|并行无人机的调度优化问题PDSTSP
  15. ❤ ❤html canvas面向对象的彩色小球❤ ❤
  16. 桌面图标有阴影去除方法
  17. 1 ,ps2017 安装
  18. 【Numpy】np.stack()最通俗易懂解释
  19. 度小满联合北大光华聚焦超级关联网络,硬技术能否改变行业风向?
  20. Learning to Estimate the Travel Time(翻译)

热门文章

  1. 读书笔记软件调试之道 :问题的核心-诊断
  2. 解决苹果浏览器点击事件无法生效的问题
  3. 孙悟空吃蟠桃c语言编程,孙悟空吃蟠桃歇后语
  4. Rails 内置方法大全(慢慢积累中)
  5. IIS6 + Resin3.1.x 的不爽之处
  6. s00devs_Devs @ Home –实时网络研讨会– 5月14日,13:00 CEST:高效应用程序的7个JVM参数
  7. 嵌入式系统设计的核心技术
  8. kafka 延迟队列
  9. python解析gff文件中的转录本
  10. python 椭圆曲线_Python、Sympy和椭圆曲线