测试代码如下:

1、耗时计算没有单独起线程处理,耗时计算在EDT线程执行,导致界面没有响应,处于卡死状态

package thread;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.SwingUtilities;

public class Test {

public static void main(String[] args) {

JFrame frame=new JFrame();

final JButton button=new JButton();

button.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

// TODO Auto-generated method stub

button.setLabel("busy");

button.setEnabled(false);

//ExecutorService executorService=Executors.newCachedThreadPool();

//executorService.execute(new Runnable() {

//

//public void run() {

// TODO Auto-generated method stub

for (int i = 0; i < 10000000; i++) {

System.out.println("operation is running");

}

//button.setLabel("");

//}

//});

}

});

button.setSize(50, 20);

frame.add(button);

frame.setVisible(true);

frame.pack();

}

}

2、

2、起线程处理耗时操作,耗时操作单独在一个线程处理,界面及时响应,没有问题

3、窗体设置部分代码在主线程处理

4、建议代码如下,对界面的操作应该放在edt线程里去处理,即使是组件的初始化也最好放在EDT中处理,虽然从主线成直接初始化组件发生的错误概率很小,但还是要避免。

上述的SwingUtilites.invokeLater也可有EventQueue.invokeLater代替,这两个方法都是正确的,选择任何一个都可以。实际上,SwingUtilities版只是一个薄薄的封装方法,它直接调用 EventQueue.invokeLater。因为Swing框架本身经常调用SwingUtilities,使用SwingUtilities可以减 少程序引入的类。

第一条规则同通常称为单一线程规则,在任何非EDT线程中都不该接触swing组件。这两条规则看似是矛盾的,既然将耗时的操作放入其他其他线程,那么当耗时操作完成时如何将结果更新到swing组件当中去?因为不能在其他线程中接触swing组件的。其实想想也不难,既然EDT本质上是从事件队列中拿出事件来处理的,那么只要能在其他线程中把耗时操作完成以后再把更细ui组件的代码封装放到事件队列中就行了,到时EDT自然会从事件队列取出代码执行用以达到更新的目的,这样两条规则都满足了。其实在任何线程中,可以使用两种方法想事件队列添加任意的动作。即调用SwingUtilites类(或者EventQueue类也是一样)invokeLater或者invokeAndWait两个静态方法向事件队列添加任务。

package thread;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.SwingUtilities;

public class Test {

public static void main(String[] args) {

JFrame frame=new JFrame();

final JButton button=new JButton();

button.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

// TODO Auto-generated method stub

button.setLabel("busy");

button.setEnabled(false);

ExecutorService executorService=Executors.newCachedThreadPool();

executorService.execute(new Runnable() {

public void run() {

// TODO Auto-generated method stub

for (int i = 0; i < 10000000; i++) {

System.out.println("operation is running");

}

//对gui组建的操作放在edt线程处理

SwingUtilities.invokeLater(new Runnable() {

public void run() {

// TODO Auto-generated method stub

button.setLabel("");

}

});

}

});

}

});

//界面的初始化其实也不应该放在主线程执行,应该放在edt线程,虽然出错的概率不大

button.setSize(50, 20);

frame.add(button);

frame.setVisible(true);

frame.pack();

}

}

java edt,java并发之EDT测试相关推荐

  1. java 时区 edt_JAVA TimeZone发行EDT对EST

    我是java的新手,因此很长一段时间以来都无法解决这个问题. 我使用的是Windows XP,机器设置为TimeZone:Eastern Time(美国和加拿大). 我有一个Java应用程序,它获取当 ...

  2. java edt,Java Swing 学问篇 - EDT

    Java Swing 常识篇之EDT 从毕业到现在用SWING已经一年多,在这里想总结一下过去学到的东西和经验,和各位兄弟姐妹们一起分享.在以后的文章中也会和大家一起来分享一些好的框架.说起JAVA ...

  3. Java游戏服务器开发之A星算法

    Java游戏服务器开发之A星算法    学习这个主要是用于寻路算法.    参考资料主要是siki学院的视频,A计划--人工智能--A星算法. 网址http://www.sikiedu.com/cou ...

  4. Java 控制台程序的基本结构测试分析草稿

    Java 控制台程序的基本结构测试分析 19 xon 继续

  5. JNI开发笔记(八)--Java读取txt文件进行JNI测试

    Java读取txt文件进行JNI测试 引 前言 1. 新建assets文件夹 2. 载入测试文件 3. 建立文件读取方法 4. 在MainActivity中读取文件数据 引 JNI开发笔记(一)–An ...

  6. java设计一个程序后怎么测试_Java语言程序设计(第1阶段学习测试)(都平)

    第 1 页 共 5 页 山东省过程性考试课程 Java 语言程序设计(第2阶段)测试 一. 简答题 (本大题共15个小题,每小题4分,共60分) 1. 什么是类?任何定义一个类?类中包含哪几部分,分别 ...

  7. Java微信支付API文档测试

    Java微信支付API文档测试(注意用的微信开发文档是什么支付) 本人用的刷卡支付( 之前看错了,一直在看扫码支付,心塞 ),如图 首先,做一系列准备,获取appid等等,可以写在一个配置文件里面,如 ...

  8. c语言blackjack设计思路,写一个“BlackJack ”Java应用程序 该计划将测试你的逻辑思维。...

    写一个"BlackJack "Java应用程序 该计划将测试你的逻辑思维. 答案:1  信息版本:手机版 解决时间 2019-10-05 09:51 已解决 2019-10-05 ...

  9. Java学习路线(22)——测试框架Junit

    一.单元测试概念 单元测试就是针对最小的功能单元编写测试代码,Java程序最小的功能单元是方法,因此,单元测试就是针对Java方法的测试,进而检查方法正确性. 二.Junit测试框架 (一)概念: J ...

  10. 基于Java毕业设计宠物论坛设计网站测试视频2021源码+系统+mysql+lw文档+部署软件

    基于Java毕业设计宠物论坛设计网站测试视频2021源码+系统+mysql+lw文档+部署软件 基于Java毕业设计宠物论坛设计网站测试视频2021源码+系统+mysql+lw文档+部署软件 本源码技 ...

最新文章

  1. 图像相似度测量与模板匹配总结
  2. Go if _,ok:=range map; ok判断key是否在map中
  3. linux安卓环境更新失败,Android SDK Manager国内无法更新的解决方案
  4. superset可视化-country map
  5. 西安邮电大学卓越班c语言面试题,西安邮电大学C语言实验报告.docx
  6. iText中给pdf内容添加水印
  7. UIAlertController中TextField的用法
  8. Android倒计时工具
  9. Excel常用快捷键与打印
  10. 吉他php怎么弹,吉他弹奏技巧(一看就会)
  11. 【积累小技巧】word格式刷没作用
  12. 计算机安装xp蓝屏怎么办,win7系统下装xp出现0x0000007B蓝屏解决方法|win7改装xp系统怎么设置BIOS...
  13. 8、16、32-BIT系列单片机区别与特点
  14. OPCClient远程连接OPC服务器配置手册
  15. 【QT】The inferior stopped because it received a signal from the operating system及opencv_gapi模块cmake错误
  16. 房价下跌的“理由”越来越多
  17. ,片片鳞甲都烁烁生辉
  18. 金融学经济学字母含义
  19. 4.1 使用旋转和镜像工具制作图标 [Illustrator CC教程]
  20. 无线充电宝当无线充电器哪个品牌好?快充无线充电宝推荐

热门文章

  1. 西游记中孙悟空的蜕变
  2. 淘宝爬虫实战---requests库实现模拟登陆模块
  3. 对接微信二维码支付流程
  4. 艾宾浩斯遗忘曲线PHP,艾宾浩斯记忆遗忘曲线 复习计划表 网盘下载
  5. 近视手术能不能做?怎么做?丁香医生告诉你
  6. IT职场人生系列之二十三:知识体系(专家与杂家)
  7. 前后端分离电商B2C模式之_后端_商品评论功能
  8. 美容行业小程序的价值好处
  9. Rust之包,箱和模块管理(四):用use关键字引用其他包
  10. Synology NAS群晖DS218play 运行内存测试