不同Swing线程的模型设计

开发 后端
本文介绍不同Swing线程的模型设计,判断是抢占式还是协作式的线程模型,取决于虚拟机的实现者,并根据各种实现而不同。因此,Java 开发员必须编写那些能够在两种模型上工作的程序。

为不同的线程模型进行设计

正如前面所提到的,在抢占式模型中线程可以在代码的任何一个部分的中间被打断,除非那是一个原子操作代码块。原子操作代码块中的代码段一旦开始执行,就要在该线程被换出处理器之前执行完毕。在 Java 编程中,分配一个小于 32 位的变量空间是一种原子操作,而此外象 double 和 long 这两个 64 位数据类型的分配就不是原子的。使用锁来正确同步共享资源的访问,就足以保证一个多线程程序在抢占式模型下正确工作。

而在协作式模型中,是否能保证线程正常放弃处理器,不掠夺其他线程的执行时间,则完全取决于程序员。调用 yield() 方法能够将当前的线程从处理器中移出到准备就绪队列中。另一个方法则是调用 sleep() 方法,使线程放弃处理器,并且在 sleep 方法中指定的时间间隔内睡眠。

正如你所想的那样,将这些方法随意放在代码的某个地方,并不能够保证正常工作。如果线程正拥有一个锁(因为它在一个同步方法或代码块中),则当它调用 yield() 时不能够释放这个锁。这就意味着即使这个线程已经被挂起,等待这个锁释放的其他线程依然不能继续运行。为了缓解这个问题,最好不在同步方法中调用 yield 方法。将那些需要同步的代码包在一个同步块中,里面不含有非同步的方法,并且在这些同步代码块之外才调用 yield。

另外一个解决方法则是调用 wait() 方法,使处理器放弃它当前拥有的对象的锁。如果对象在方法级别上使同步的,这种方法能够很好的工作。因为它仅仅使用了一个锁。如果它使用 fine-grained 锁,则 wait() 将无法放弃这些锁。此外,一个因为调用 wait() 方法而阻塞的线程,只有当其他线程调用 notifyAll() 时才会被唤醒。

AWT/Swing线程

在那些使用 Swing和AWT 包创建 GUI (用户图形界面)的 Java 程序中,AWT 事件句柄在它自己的线程中运行。开发员必须注意避免将这些 GUI 线程与较耗时间的计算工作绑在一起,因为这些线程必须负责处理用户时间并重绘用户图形界面。换句话来说,一旦 GUI 线程处于繁忙,整个程序看起来就象无响应状态。Swing线程通过调用合适方法,通知那些 Swing callback (例如 Mouse Listener 和 Action Listener )。 这种方法意味着 listener 无论要做多少事情,都应当利用 listener callback 方法产生其他线程来完成此项工作。目的便在于让 listener callback 更快速返回,从而允许 Swing线程响应其他事件。

如果一个 Swing线程不能够同步运行、响应事件并重绘输出,那怎么能够让其他的线程安全地修改 Swing 的状态?正如上面提到的,Swing callback 在 Swing线程中运行。因此他们能修改 Swing 数据并绘到屏幕上。

但是如果不是 Swing callback 产生的变化该怎么办呢?使用一个非 Swing线程来修改 Swing 数据是不安全的。Swing 提供了两个方法来解决这个问题:invokeLater() 和 invokeAndWait()。为了修改 Swing 状态,只要简单地调用其中一个方法,让 Runnable 的对象来做这些工作。因为 Runnable 对象通常就是它们自身的线程,你可能会认为这些对象会作为线程来执行。但那样做其实也是不安全的。事实上,Swing 会将这些对象放到队列中,并在将来某个时刻执行它的 run 方法。这样才能够安全修改 Swing 状态。

【编辑推荐】

  1. Swing模型过滤器概述
  2. 浅谈WebRenderer与Swing应用程序
  3. TableModelExample可以简化Swing
  4. JTable和TableModel简化Swing
  5. 用BeanTableModel简化Swing
责任编辑:佚名 来源: CSDN
相关推荐

2012-01-17 17:21:24

JavaSwing

2009-07-16 08:53:03

Swing任务Swing线程

2009-07-16 09:54:44

LookupEventSwing线程

2009-04-30 09:10:42

JavaSwing线程安全

2009-07-14 15:34:22

Swing中的线程GUI程序

2009-07-15 18:06:38

Swing线程

2009-07-15 16:03:26

Swing线程

2009-07-09 11:55:17

Swing模型过滤

2009-07-15 17:09:32

Swing线程

2009-07-16 11:19:48

外部线程Swing组件

2009-07-16 16:23:59

Swing线程

2009-07-14 09:09:08

Swing模型过滤器

2009-07-15 13:48:26

Swing模型和渲染器

2012-01-17 16:41:08

JavaSwing

2009-07-10 16:14:29

MVC设计模式Swing

2010-05-24 14:04:48

JavaSwing多线程

2012-01-16 16:16:49

JavaSwing

2009-07-15 15:35:59

Swing程序Swing性能

2010-03-24 10:56:05

Python线程编程

2009-06-17 14:38:14

面向对象数学模型物理模型
点赞
收藏

51CTO技术栈公众号