[转载]SwingUtilities中invokeLater和invokeAndWait的介绍

Cursor接入Claude官方Skills:四步搭建AI教育专属工作流 AI编程工具正在从自动补全走向真正的智能协作,但很多开发者仍停留在手动复制粘贴的阶段。Cursor作为AI原生IDE,其Agent模式具备自主规划与执行能力,而Claude官方Skills则提供了一套结构化专业工作流的执行标准。通过将两者结合,让通用模型按照预设流程完成复杂任务,能显著提升开发与内容生产效率。这种能力在AI+教育场景中尤为实用,例如自动生成符合教学法的课程大纲、课件结构图,甚至将教学设计经验固化到可复用的技能包中。本文以实际项目为基础,完整演示了从环境准备、技能拉取到桥接配置的四个步骤,并给 阅读详情
 

 

 

SwingUtilities中invokeLater和invokeAndWait介绍
   在Java中Swing是线程不安全的,是单线程的设计,这样的造成结果就是:只能从事件派发线程访问将要在屏幕上绘制的Swing组件。事件派发线程是调用paint和update等回调方法的线程,它还是事件监听器接口中定义的事件处理方法,例如,ActionListener中的actionPerformed方法在事件派发线程中调用。
   Swing是事件驱动的,所以在回调函数中更新可见的GUI是很自然的事情,比如,有一个按钮被按下,项目列表需要更新时,则通常在与该按钮相关联的事件监听器的actionPerformed方法中来实现该列表的更新,从事件派发线程以外的线程中更新Swing组件是不正常的。
   有时需要从事件派发线程以外的线程中更新Swing组件,例如,在actionPerformed中有很费时的操作,需要很长时间才能返回,按钮激活后需要很长时间才能看到更新的列表,按钮会长时间保持按下的状态只到actionPerformed返回,一般说来耗时的操作不应该在事件处理方法中执行,因为事件处理返回之前,其他事件是不能触发的,界面类似于卡住的状况,所以在独立的线程上执行比较耗时的操作可能更好,这会立即更新用户界面和释放事件派发线程去派发其他的事件。
   SwingUtilities类提供了两个方法:invokeLate和invoteAndWait,它们都使事件派发线程上的可运行对象排队。当可运行对象排在事件派发队列的队首时,就调用其run方法。其效果是允许事件派发线程调用另一个线程中的任意一个代码块。
   只有从事件派发线程才能更新组件。
   程序示例:更新组件的错误方法
   startButton.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent e) {
    GetInfoThread t = new GetInfoThread(Test.this);
    t.start();
    startButton.setEnabled(false);
   }
  });
  
  class GetInfoThread extends Thread {
 Test applet;

 public GetInfoThread(Test applet) {
  this.applet = applet;
 }

  public void run() {
   while (true) {
    try {
     Thread.sleep(500);
     applet.getProgressBar().setValue(Math.random() * 100);
    } catch (InterruptedException e) {
     e.printStackTrace();
    }
   }
  }
 }
 错误分析:在actionPerformed中,监听器把按钮的允许状态设置为false,由于是在事件派发线程上调用actionPerformed,所以setEnabled是一个有效的操作,但是在GetInfoThread中设置进度条是一个危险的做法,因为事件派发线程以外的线程更新了进度条,所以运行是不正常的。

   1、invokeLater使用
    class GetInfoThread extends Thread {
  Test applet;
 
  Runnable runx;
 
  int value;

  public GetInfoThread(final Test applet) {
   this.applet = applet;
   runx = new Runnable() {
    public void run() {
     JProgressBar jpb = applet.getProgressBar();
     jpb.setValue(value);
    }
   };
  }

   public void run() {
    while (true) {
     try {
      Thread.sleep(500);
      value = (int) (Math.random() * 100);
      System.out.println(value);
      SwingUtilities.invokeLater(runx);
     } catch (InterruptedException e) {
      e.printStackTrace();
     }
    }
   }
  }
   
   2、invokeAndWait
   与invoikeLater一样,invokeAndWait也把可运行对象排入事件派发线程的队列中,invokeLater在把可运行的对象放入队列后就返回,而invokeAndWait一直等待知道已启动了可运行的run方法才返回。如果一个操作在另外一个操作执行之前必须从一个组件获得信息,则invokeAndWait方法是很有用的。
   class GetInfoThread extends Thread {
   Runnable getValue,setValue;
   int value,currentValue;
   public GetInfoThread(final Test applet){
   getValue=new Runnable(){
   public void run(){
    JProgressBar pb=applet.getProgressBar();
    currentValue=pb.getValue();
    }
   };
   setValue=new Runnable(){
    public void run(){
     JProgressBar pb=applet.getProgressBar();
     pb.setValue(value);
    }
   }
   }
   public void run(){
    while(true){
    try{
    Thread.currentThead().sleep(500);
    value=(int)(Math.random()*100);
    try{
    SwingUtilities.invokeAndWait(getValue);//直到getValue可运行的run方法返回后才返回
      }catch(Exception ex){
      }
      if(currentValue!=value){
      SwingUtilities.invokeLater(setValue);
      }
     }
     }catch(Exception ex){
      }
    }
   }
   invokeLater和invoikeAndWait的一个重要区别:可以从事件派发线程中调用invokeLater,却不能从事件派发线程中调用invokeAndWait,从事件派发线程调用invokeAndWait的问题是:invokeAndWait锁定调用它的线程,直到可运行对象从事件派发线程中派发出去并且该可运行的对象的run方法激活,如果从事件派发线程调用invoikeAndWait,则会发生死锁的状况,因为invokeAndWait正在等待事件派发,但是,由于是从事件派发线程中调用invokeAndWait,所以直到invokeAndWait返回后事件才能派发。
   ex)actionPerformed();返回的时候事件派发线程才能派发线程,而在actionPerformed中使用invokeAndWait则会导致actionPerformed不能返回。所以也就无法派发invokeAndWait中的线程。

由于Swing是线程不安全的,所以,从事件派发线程之外的线程访问Swing组件是不安全的,SwingUtilities类提供这两种方法用于执行事件派发线程中的代码

转载自http://www.blogjava.net/Swing/archive/2007/07/10/129338.html

SAP IDOC与EDI实战解析:从基础原理到跨系统采购订单同步 本文深入解析了SAP IDOC与EDI在企业数据交换中的核心作用,通过跨系统采购订单同步的实战案例,详细阐述了从基础原理到配置部署的全过程。文章将IDOC比作标准化数据“集装箱”,EDI视为高效传输“高速公路”,并提供了从消息类型定义、处理代码开发到全链路测试的完整指南,帮助企业实现自动化、无差错的业务协同。 阅读详情

相关推荐

切比雪夫(最小区域法)直线拟合算法

切比雪夫,最小区域法直线拟合

闪电彬彬的博客 3964

java多线程学习之14invokeLater()方法与invokeAndWait()的使用

invokeLater();与invokeAndWait();的使用:(这两个方法可以在"非"事件分派线程中被调用!)这两个方法都属于SwingUtilities类是两个静态成员方法(类方法!) —————————————————————————————————————————————————————————————————————————————— swing技术下有个工具类:SwingUtilities这个类很奇特: 首先SwingUtilities.isEventDispatchThread()当其返

zy103118的博客 1343

Ansys Lumerical实战:5步搞定Mach-Zehnder调制器多物理场仿真(附眼图分析技巧)

本文详细介绍了使用Ansys Lumerical进行行波马赫-曾德尔调制器多物理场仿真的完整流程。通过CHARGE、MODE和INTERCONNECT三大模块的协同工作,从电学参数提取、光学射频特性分析到系统级眼图评估,分步解析了高效仿真与性能优化的核心技巧,为硅光调制器设计提供了实战指南。

weixin_29056781的博客 544

Java的invokeLater

是 Java Swing 库中的一个方法,用于确保一个任务可以在稍后的某个时间在事件分发线程(Event Dispatch Thread, EDT)上执行。在 Swing 应用程序中,所有的组件更新和操作通常需要在这个线程上完成,以避免线程安全问题。是一个实用的工具,用于确保代码块在 Swing 的事件分发线程上异步执行,这对于维护 Swing 应用程序的线程安全至关重要。这个程序的功能与之前的示例相同,只是使用了 lambda 表达式来替代匿名内部类,使代码更加简洁。在这个例子中,我们创建了一个。

weixin_63490470的博客 2311

使用PyTorch设计卷积神经网络(CNN)来处理遥感图像Indian Pines数据集

使用PyTorch设计卷积神经网络(CNN)来处理遥感图像Indian Pines数据集

XAX520_1314的博客 2491

深度探索:非线性随机森林(Nonlinear Random Forest,NL-RF)原理及应用

非线性随机森林(NL-RF)旨在通过结合集成方法与高级技术来捕捉和建模数据中的非线性关系,从而改善传统随机森林在处理复杂非线性数据结构时的表现。

qq_51320133的博客 2067

invokeLater和invokeAndWait

invokeLater和invokeAndWait的区别invokeLater:在把可运行的对象放入队列后就返回,而invokeAndWait一直等待已启动了可运行的run方法才返回。如果一个操作在另外一个操作执行前必须从一个组件获得信息,则invokeAndWait方法很有用的。 public class SwingDemoInvokeAndWait { public s

hhtq的博客 863

避开SM30维护视图的坑:自动更新字段+日志记录的5个关键配置步骤

本文深入解析了SAP ABAP开发中SM30维护视图的深度定制,聚焦于实现自动更新字段与日志记录功能。文章详细阐述了从SE54配置起点到核心编码的5个关键步骤,重点讲解了如何利用事件驱动模型(如05创建事件和01保存前事件)安全操作动态数据结构,并提供了避免常见陷阱的实用技巧,帮助开发者构建稳定可靠的自动化维护机制。

plant的博客 623

SwingUtilities的invokeLater和invokeAndWait

SwingUtilities的invokeLater和invokeAndWait

weixin_42369079的博客 580

XS5018A TX ISP芯片同轴高清模拟输出图像处理芯片用户指南

当看门狗开启且系统异常,看门狗模块得不到喂狗信号时,自动产生看门狗复位信号,复位​​​​​​​。分量上与人眼对光谱的响应通常是有偏差的,通常通过一个色彩校正矩阵校正光谱响应的交叉效。但实际上由于电路的作用,复位模块对整个芯片及各个功能模块的复位进行统一管理,负责产生各个模块的软复位信。每个区域前景色可以在 16 个色表中查找,单个区域的前景色统一,各个区域的前。较弱的坏点被放大成刺眼的白点和明显的黑点,强烈推荐开启动态坏点校正功能。四种制式,通过寄存器配置,可以很方便的实现四种制式的切换、且可以对截止。

2403_88922712的博客 1961

【数据集2】CPC Global Unified Temperature/Precipitation数据简介及处理

简介CPC 温度及降雨 数据

WW、forever的博客 3107

java 定义utilities_java命名空间javax.swing类swingutilities的类成员方法: invokeandwait定义及介绍...

导致 dorun.run() 在 awt 事件指派线程上同步执行。在所有挂起的 awt 事件被处理完(然后)返回 dorun.run() 之前,此调用将处于阻塞状态。此方法应该在应用程序线程需要更新该 gui 时使用。而不应该从 eventdispatchthread 中调用此方法。下面是一个创建新应用程序线程的示例,该应用线程使用 invokeandwait 从事件指派线程输出一个字符串,完成后...

weixin_33657398的博客 335

2025电赛嵌入式:K210教程-如何刷固件 如何烧录代码 全网唯一

本文介绍了K210开发板的固件刷写和开发环境搭建方法。主要内容包括:1)从Sipeed官网下载合适的MaixPy固件,根据需求选择完整版或精简版;2)使用k-flash等工具烧录固件,注意区分亚博和Sipeed开发板的固件版本;3)介绍了擦除闪存的两种模式(部分擦除和完全擦除)及其应用场景;4)搭建CanMV开发环境,通过MaixPy IDE连接开发板并进行程序调试。文章还提供了常见问题的解决方法,如串口驱动安装、固件兼容性检查等,为K210开发提供了完整的入门指南。

FJN110的博客 547

SwingUtilities中invokeLater和invokeAndWait介绍(转载)

SwingUtilities中invokeLater和invokeAndWait介绍   在Java中Swing是线程不安全的,是单线程的设计,这样的造成结果就是:只能从事件派发线程访问将要在屏幕上绘制的Swing组件。事件派发线程是调用paint和update等回调方法的线程,它还是事件监听器接口中定义的事件处理方法,例如,ActionListener中的actionPerformed方法在事件

whymin的专栏 435

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

关于EDT和SwingUtilities的invokeLater和invokeAndWait

在swing系统中,有一个顶级的java.awt.Container(可能是一个JFrame或JDialog实例),负责启动一个EventDispatchThread的线程,单线程,这个线程是负责处理UI事件的,如点击按钮、窗口关闭等 因此,如果将繁琐耗时的处理逻辑放到actionPerformed之类的事件处理方法中,那么这些代码是由EDT来执行的,而EDT负责处理UI事件,则会引起...

weixin_30621919的博客 98

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Swing线程之SwingUtilities.invokeLater解释

本文由 ImportNew - fzr 翻译自 cnblogs。欢迎加入翻译小组。转载请见文末要求。译者注:本文其实是一个各方见解评论的总结,已将其中于此处发布不妥的内容去掉,全文内容可查看原文。在官方的文档里:http://docs.oracle.com/javase/tutorial/uiswing/painting/step1.html 告诉我们如何创建一个gui。事件分发线程:Swing中...

dns007 2046

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

SwingUtilities.invokeLater()和SwingUtilities.invokeAndWait()的区别(有什么区别)

invokeAndWait:后面的程序必须等这个线程(参数中的线程)的东西执行完才能执行invokeLater:后面的程序和这个参数的线程对象可以并行,异步地执行invokeLater一般用于在线程里修改swing组件的外观,因为swing组件是非同步的,所以不能在线程中直接修改,会不同步,得不到期望的效果,所以要把修改外观的代码放在一个单独的线程中,交给invokeLater:后面的程序和这个参...

weixin_30881367的博客 76

Swing 线程之SwingUtilities.invokeLater()

转载自:@bzwm   http://blog.youkuaiyun.com/bzwm/article/details/3895381 现在我们要做一个简单的界面。 包括一个进度条、一个输入框、开始和停止按钮。 需要实现的功能是: 当点击开始按钮,则更新进度条,并且在输入框内把完成的百分比输出(这里只做例子,没有真正去做某个工作)。   代码1: [java] view pl

wanghjkl6的专栏 724

java 指定方法在主线程中运行

安全相关视频讲解:鸿蒙next版本完全抛弃安卓和Linux内核,纯血鸿蒙来了Windows Server 2008备份关键卷如何将两个Web服务器加入域并安装Web服务在Java中指定方法在主线程中运行 在Java编程中,我们经常需要控制某些方法在主线程中运行,以确保其在正确的时机执行,避免出现线程安全等问题。本文将...

weixin_29234423的博客 141

Java 多线程总结

线程是指一个任务从头到尾的执行流。 任务类: 1 TaskClass task = new TaskClass(); 2 class TaskClass implements Runnable{ 3 public void run(){ 4 5 } 6 } 创建任务的线程 Thread thread = new Thread(t...

weixin_30856965的博客 66

java 多线程 分发_从swing分发线程机制上理解多线程[转载]

本文参考了 http://space.itpub.net/13685345/viewspace-374940,原文作者:javagui在多线程编程当中,总会提到图形编程,比如java中的swing,并一再提出,在swing中,一切都是单线程的。所有的界面更新操作都必须在排 队似地进行。这样的目的在于,避免由于多线程的处理导致界面渲染以及组件排列异常,同时也避免了由于多线程带来的加锁访问以及等待锁的...

weixin_32323465的博客 250

SwingUtilities中invokeLater和invokeAndWait的介绍

星期日 2007年08月05日SwingUtilities中invokeLater和invokeAndWait的介绍 SwingUtilities中invokeLater和invokeAndWait介绍   在Java中Swing是线程不安全的,是单线程的设计,这样的造成结果就是:只能从事件派发线程访问将要在屏幕上绘制的Swing组件。事件派发线程是调用paint和update等回

数据就是一切 1382

Swing多线程

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

Beans 722

Java SwingUtilities.invokeLater(new Runnable(){})方法详解

SwingUtilities.invokeLater(): invokeLater一般用于在线程里修改swing组件的外观,因为swing组件是非同步的,所以不能在线程中直接修改,会不同步,得不到期望的效果,所以要把修改外观的代码放在一个单独的线程中,交给invokeLater:后面的程序(线程中的重写的run()方法及run()方法中的代码)和这个参数的线程(new Runnable())对象可以并行,异步地执行 import javax.swing.SwingUtilities; public c

巴德不说话的博客 4710

【转】invokeLater和invokeAndWait

Swing线程机制     首先swing是单线程的,这个是这篇文章的前提,也是意义所在,当swing界面程序启动的时候,会启动3个进程, 1、主线程 2、系统工具包线程:负责捕获操作系统事件,然后将事件转换成swing的事件,然后发送到事件派发线程EDT 3、事件派发线程(EDT):将事件派发到各个组件,并负责调用绘制方法更新界面 所有的事件,例如键盘,鼠标事件,都会由工具包线

SHUAI-优快云 615

【转载】Swing使用invokeLater()方法

本文介绍Swing使用invokeLater()方法和invokeAndWait()方法,以及介绍可以使用两个类来帮助你实现Swing线程。 Swing使用invokeLater()方法你可以从任何线程调用invokeLater()方法以请求事件派发线程运行特定代码。你必须把要运行的代码放到一个Runnable对象的run()方法中,并将此Runnable对象设为i

Mr.Left的IT世界 1655
上一篇: (学习笔记)简单正则表达式的使用实例[javascript]
下一篇: [学习笔记]jsp+javaBean 播放幻灯片的小例子
lovejavalovejava
博客等级 码龄19年 56粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值