Swing多线程编程

ISP工程师实战笔记:5种Demosaic算法优缺点对比(含Hamilton/DFPD代码片段) 本文从ISP工程师实战角度,深入对比了五种经典Demosaic算法的优缺点。文章详细剖析了双线性插值、Hamilton、DFPD、DLMMSE和GBTF等算法的核心思想、实现差异与性能表现,并提供了Hamilton和DFPD算法的关键代码片段。重点探讨了在图像信号处理流水线中,如何根据画质、计算复杂度和功耗等工程约束进行算法选型与权衡。 阅读详情


  • 博客分类:

    基本上所有GUI库都是单线程的,Swing就是一种GUI库。什么意思呢?就是说所有对UI的更新都是在主线程中进行,这也是Swing的EDT线程(事件派发线程)也被叫UI线程的原因。如果在UI线程中执行比较耗时的操作,界面会卡住。Swing有个单线程规范,只要牢记会避免很多大坑:所有界面操作的更新都应该在EDT线程执行,所有耗时的操作都应该在单独线程中执行。

     请牢记上面的红字部分,然后我们开始一个实例:点击按钮后,按钮显示秒数,每过一秒显示加1。下面是第一个版本

伦理片 http://www.dotdy.com/

Java代码   收藏代码
  1. package com.albert.frame;  
  2.   
  3. import java.awt.BorderLayout;  
  4.   
  5. public class TestSwing extends JFrame {  
  6.     private JPanel contentPane;  
  7.   
  8.     public static void main(String[] args) {  
  9.         EventQueue.invokeLater(new Runnable() {  
  10.             public void run() {  
  11.                 try {  
  12.                     TestSwing frame = new TestSwing();  
  13.                     frame.setVisible(true);  
  14.                 } catch (Exception e) {  
  15.                     e.printStackTrace();  
  16.                 }  
  17.             }  
  18.         });  
  19.     }  
  20.   
  21.     public TestSwing() {  
  22.         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
  23.         setBounds(100100450300);  
  24.         contentPane = new JPanel();  
  25.         contentPane.setBorder(new EmptyBorder(5555));  
  26.         contentPane.setLayout(new BorderLayout(00));  
  27.         setContentPane(contentPane);  
  28.           
  29.         final JButton button = new JButton("点击");  
  30.         contentPane.add(button, BorderLayout.CENTER);  
  31.         button.addActionListener(new ActionListener() {  
  32.             public void actionPerformed(ActionEvent e) {  
  33. an              for(int i=0;i<=5;i++){  
  34.                     try {  
  35.                         Thread.sleep(1000);  
  36.                     } catch (InterruptedException e1) {  
  37.                         e1.printStackTrace();  
  38.                     }  
  39.                     button.setText(i+"");  
  40.                 }  
  41.             }  
  42.         });  
  43.     }  
  44.   
  45. }  

 运行代码点击按钮后,会发现界面卡住了,然后过了5秒后,按钮上直接显示了5。而不是我们期望的从0开始每隔一秒加1。

 

      这是上面原因呢?很明显这个违背了上面的原则:不能在EDT线程中进行耗时操作。因为你的耗时操作占用了EDT线程,然后界面更新会去耗时操作后面排队,最后同一个组件的界面更新会合并成最后一个也就是直接显示5。需要说明的是Swing组件的各种事件监听方法都是在EDT线程调用的,比如单击事件。

 

      既然程序并没有按照我们的想法执行,是因为违背了GUI单线程的原则,那我们再次修改下程序,把耗时操作的代码加入到单独的线程中,只贴出修改的部分


Java代码   收藏代码
  1. button.addActionListener(new ActionListener() {  
  2.             public void actionPerformed(ActionEvent e) {  
  3.                 new Thread(new Runnable() {  
  4.                     public void run() {  
  5.                         for(int i=0;i<=5;i++){  
  6.                             try {  
  7.                                 Thread.sleep(1000);  
  8.                             } catch (InterruptedException e1) {  
  9.                                 e1.printStackTrace();  
  10.                             }  
  11.                             button.setText(i+"");  
  12.                         }  
  13.                     }  
  14.                 }).start();  
  15.             }  
  16.         });  
  17. }  

 

 影音先锋电影 http://www.iskdy.com/

运行程序并且点击按钮,发现程序按照我们的期望执行了。是不是很开心啊,可是不要高兴的太早,虽然功能实现了,但是还是违背了GUI单线程原则:在EDT线程中进行界面的更新。而我们在单独线程中运行了这段界面更新操作的代码:button.setText(i+"")。

       简直头大,button.setText()和我们的耗时操作是一个代码块怎么能分开在两个线程执行啊?日了狗日了!!其实Swing给我们提供了一个工具类SwingUtilities,里面有个方法invokeLater(Runnable runnable),这个方法的作用就是把一个runnable(就是一个任务,很多初学者学习线程认为Runnable也是线程的一部分,其实Runnable只是一个有一个run方法声明的接口)传到EDT线程中,让EDT线程去执行再次修改。




JavaSwing_5.4: 多线程并发与线程安全 本文链接: http://blog.csdn.net/xietansheng/article/details/78389265 Java Swing 图形界面开发(目录) 1. 概述 官方JavaDocsApi: Swing’s Threading Policy 前面的所有 Swing 组件案例代码,为了简单重点介绍组件,都直接在主线程中直接创建并显示,实际开发中这将会存在线程安全隐患... 阅读详情

相关推荐

YOLOv12改进策略【注意力机制篇】| 2024 PPA 并行补丁感知注意模块,提高小目标关注度(二次改进A2C2f)

本文记录的是利用改进检测精度,详细说明了优化原因,注意事项等。原论文在红外小目标检测任务中,小目标在多次下采样操作中容易丢失关键信息。通过替代编码器和解码器基本组件中的传统卷积操作,更好地保留小目标的重要信息。HCF-Net: Hierarchical Context Fusion Network for Infrared Small Object Detection采用多分支特征提取策略,通过不同分支提取不同尺度和层次的特征。利用局部、全局和串行卷积分支,对输入特征张量进行处理。通过控制 patch si

Limiiiing的博客 1823

Swing多线程

当运行一个 Swing 程序时,会自动创建三个线程。 1.主线程,负责执行main 方法。 2. toolkit 线程,负责捕捉系统事件,比如键盘、鼠标移动等,程序员不会有任何代码在这个线程执行。Toolkit线程的作用是把自己捕获的事件传递给第三个线程,也就是事件派发线程。 3. 事件派发线程(EDT,Event Dispatcher Thread),顾名思义是用来派发事件(

Beans 719

几个swing多线程的例子

几个用java写的小例子,是学习的好参考。

java swing 多线程_Swing多线程

:现在我们要做一个简单的界面。包括一个进度条、一个输入框、开始和停止按钮。需要实现的功能是:当点击开始按钮,则更新进度条,并且在输入框内把完成的百分比输出(这里只做例子,没有真正去做某个工作)。1 packagetest;23 importjava.awt.FlowLayout;4 importjava.awt.event.ActionEvent;5 importjava.awt.event.Ac...

weixin_39870700的博客 547

动态弹球(Java多线程实现+swing

根据老师上课讲的内容,完成了一个小作业,发到这里,希望可以帮助到需要的人,也希望大家来指点。 效果图: 点击"创建小球",在窗体底部任意位置弹出颜色随机小球,小球碰到四边或与其他小球相撞就会反弹,随着时间增加,小球运动速度加快并变大: 首先我们创建两个按钮对象以及一个画布对象(绘制小球),设置窗体参数: private Button startButton; private Button exitButton; private Canvas canvas; public static int

qq_44832011的博客 2049

java swing 多线程 对话框_Swing多线程编程(转)

关键字:Swing,多线程,GUI,SwingWorker摘要:本文论述了怎样开发多线程Swing程序,从而提高Swing程序的响应速度和性能。近期,我将推出一系列研究Swing程序的文章,这也算是为了向Swing这个优秀的GUI库的设计者致敬吧!Swing这种优秀的GUI库一直不能占领桌面市场,实在令人费解,今天,我就用我的努力,为java在桌面市场的成功尽我微薄之力吧!Swing的单线程开发...

weixin_31544577的博客 267

Swing多线程编程(转)

关键字: Swing,多线程,GUI,SwingWorker 摘要: 本文论述了怎样开发多线程Swing程序,从而提高Swing程序的响应速度和性能。 近期,我将推出一系列研究Swing程序的文章,这也算是为了向Swing这个优秀的GUI库的设计者致敬吧! Swing这种优秀的GUI库一直不能占领桌面市场,实在令人费解,今天,我就用我的努力...

weixin_33975951的博客 96

关于swing多线程理解

1.swing介绍 Swing是SUN推出的轻量级的开发用户界面的工具包,最初它的设计是在单线程环境下运行的,它的执行也是单线程的,这也就是为什么我们说Swing不是多线程安全的。所以为了编写交互性更高的UI界面,必须了解其内部的线程运行机制。         Swing程序往往包括了三种类型的线程,而且运行一个Swing应用程序,都会自动创建三个线程,分别是:

liyheng的博客 984

Swing多线程操作UI

由于Swing不是线程安全的, 因此在实际操作过程中, 应避免通过多线程来操作UI. 在必要时, 应注意要将控件转移到事件调度线程。转移控件和开始处理 Swing 的首选方法是使用 invokeLater。 简单的实践: 在如下小程序中, 通过最上方或最下方的Parse 都可以针对某文件或URL进行解析, 并解析出文件中含有的Email, 并归类但因在中间的TextArea中. 在按下Pa

paullinjie的博客 2802

黑马程序员——基础学习(十四)多线程(Thread)和图形界面编程(GUI)

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- Thread(多线程) 同步方法及其锁对象 this 静态同步方法其锁对象 类名.class 死锁 就是两个线程都进入锁,而都在等待对方释放锁造成的程序停滞现象 我的代码: public class DieLock extends Thread { private b

米得的博客车间 2877

Java Swing中的多线程

对Java Swing中的多线程操作进行介绍, 以创建一个如下图所示的计时器界面为例对Swing中的多线程进行介绍 在该计时器界面中按下start键开始计时,按下stop键,计时停止 ...

weixin_43571468的博客 5036

Swing多线程-小结

(1)如果要在图形界面上显示经过数据查询或经过其他方式得来的数据,一般将这个过程放在一个线程中,由该线程进行单独运算,并随时更新图形界面。(2)Swing线程发生死锁的时候,如果是使用命令行的方式运行的该程序,可以使用CTRL+BREAK的快捷键,会得到线程死锁的位置,堆栈的一些信息。(3)只有与Swing相同的线程才能对Swing中的组件进行调用,修改等,如ActionListener中的处理就是与Swing保持在同一个线程侯中,不在同一个线程时,需使用SwingUtilities.invokeLater

luoshenFU的专栏 2299

Swing中的并发和多线程(转)

简单来说,Swing中有三种线程:   1、启动线程或者初始线程: 这个线程负责调用main方法,很多顺序编程一开始就用的是这种线程。在        Swing中启动线程负责很少的事务,主要干两件事情:       第一件就是创建一个可运行的对象(Runnable Object),这个可运行对象的任务比较重要,它负责初始化       图形界面。       第二件就是将这个可运行对象安排到另外...

longyi_java的专栏 800

ComfyUI workflows,ComfyUI 工作流合集,ComfyUI workflows collection.zip

AI工作流集合 - 200+ 实用生产力工作流

上一篇: [探测与发现]星际之门计划
下一篇: 微信公众号的黑色商业链揭秘
dotedy
博客等级 码龄11年 61粉丝 0原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值