SwingWorker单线程规则

开发 后端
本文介绍SwingWorker单线程规则,以及许多程序都不需要后台线程,后台线程在执行费时的操作时仍然是很有用的,它能提高程序的性能观感。

SwingAPI的设计目标是强大、灵活和易用。非凡地,我们希望能让程序员们方便地建立新的Swing组件,不论是从头开始还是通过扩展我们所提供的一些组件。出于这个目的,我们不要求Swing组件支持多线程访问。相反,我们向组件发送请求并在单一线程中执行请求。本文讨论线程和Swing组件。目的不仅是为了帮助你以线程安全的方式使用SwingAPI,而且解释了我们为什么会选择现在这样的线程方案。本文包括以下内容:

单线程规则:SwingWorker单线程在同一时刻仅能被一个线程所访问。一般来说,这个线程是事件派发线程。规则的例外:有些操作保证是线程安全的。事件分发:假如你需要从事件处理或绘制代码以外的地方访问UI,那么你可以使用SwingUtilities 类的invokeLater要求在事件派发线程中执行某些代码。这个方法会立即返回,不会等待代码执行完毕。invokeAndWait行为与 invokeLater类似,除了这个方法会等待代码执行完毕。一般地,你可以用invokeLater来代替这个方法。下面是一些使用这几个API的例子。请同时参阅《TheJavaTutorial》中的“BINGOexample”,尤其是以下几个类:CardWindow、ControlPane、Player和OverallStatusPane。

使用invokeLater方法你可以从任何线程调用invokeLater方法以请求事件派发线程运行特定代码。你必须把要运行的代码放到一个 Runnable对象的run方法中,并将此Runnable对象设为invokeLater的参数。invokeLater方法会立即返回,不等待事件派发线程执行指定代码。这是一个使用invokeLater方法的例子:

  1. RunnabledoWorkRunnable=newRunnable 

SwingUtilities.invokeLater; 使用invokeAndWait方法invokeAndWait方法和invokeLater方法很相似,除了invokeAndWait方法会等事件派发线程执行了指定代码才返回。在可能的情况下,你应该尽量用invokeLater来代替invokeAndWait。假如你真的要使用 invokeAndWait,请确保调用invokeAndWait的线程不会在调用期间持有任何其他线程可能需要的锁。

这是一个使用invokeAndWait的例子:

  1. voidshowHelloThereDialogthrowsException  
  2. }  
  3. SwingUtilities.invokeAndWait;  

类似地,假设一个线程需要对GUI的状态进行存取,比如文本域的内容,它的代码可能类似这样:

  1. voidprintTextField  
  2. throwsException  
  3. }  
  4. SwingUtilities.invokeAndWait  
  5. System.out.println  

假如你能避免使用线程,最好这样做。线程可能难于使用,并使得程序的debug更困难。一般来说,对于严格意义下的GUI工作,线程是不必要的,比如对组件属性的更新。不管怎么说,有时候线程是必要的。下列情况是使用线程的一些典型情况:执行一项费时的任务而不必将事件派发线程锁定。例子包括执行大量计算的情况,会导致大量类被装载的情况,和为网络或磁盘I/O而阻塞的情况。重复地执行一项操作,通常在两次操作间间隔一个预定的时间周期。要等待来自客户的消息。你可以使用两个类来帮助你实现线程:SwingWorker:创建一个后台线程来执行费时的操作。Timer:创建一个线程来执行或多次执行某些代码,在两次执行间间隔用户定义的延迟。使用SwingWorker单线程在SwingWorker.java中实现,这个类并不包含在Java的任何发行版中,所以你必须单独下载它。SwingWorker单线程做了所有实现一个后台线程所需的肮脏工作。虽然许多程序都不需要后台线程,后台线程在执行费时的操作时仍然是很有用的,它能提高程序的性能观感。

【编辑推荐】

  1. 动态语言是否将会挽救Swing
  2. 用TableModel框架简化Swing开发
  3. Swing模型过滤技术详解
  4. Java Swing开发的一些热点
  5. 使用Swing动态界面设计技术透析
责任编辑:佚名 来源: 中国IT实验室
相关推荐

2020-11-09 09:33:37

多线程

2010-08-30 08:55:56

JavaScript引

2022-01-04 11:11:32

Redis单线程Reactor

2024-02-26 00:00:00

JavaScript单线程高效

2017-03-06 14:08:38

JavaScript单线程setTimeout

2010-01-28 16:45:44

Android单线程模

2009-04-30 09:10:42

JavaSwing线程安全

2012-02-15 10:26:40

JavaJava Socket

2019-11-25 10:13:52

Redis单线程I

2023-08-17 14:12:17

2020-10-30 16:20:38

Redis单线程高并发

2020-06-11 09:35:39

Redis单线程Java

2023-10-15 12:23:10

单线程Redis

2021-01-10 11:21:33

JavaScript语言开发

2021-06-11 11:28:22

多线程fork单线程

2019-06-17 14:20:51

Redis数据库Java

2009-07-17 17:41:41

SwingWorker

2020-09-23 13:37:25

Redis6.0

2019-05-07 09:44:45

Redis高并发模型

2019-05-06 11:12:18

Redis高并发单线程
点赞
收藏

51CTO技术栈公众号