多线程之Worker Thread pattern和Swing

原创 2007年09月16日 21:10:00

最近闲时在看《Java多线程设计模式》,很不错,语言浅显易懂,而且编排也好,很有启发性,现在挑其中一章来写写心得

worker thread是我们平时用的很多的一种多线程模式,只不过我们常常不把它当模式罢了。基本内容是:有一个流水线(channel),流水线一端有客户线程client,另一端有工人线程worker,客户不断把新的任务(request)放入流水线,工人在另一头获得任务,并执行,客户和工人的数量可多可少,就这么简单

这个所谓的pattern初看好像似曾相识,就是一个thread pool嘛, 按通常的做法,request可以实现Runnable接口,把要做的事情放在run方法中,由worker去执行,具体实现时还要注意同步的问题

不过,由此我们可以想到Swing的工作方式。Swing是事件驱动的,它有一个the event-dispatch queue,这里之所以用the,是因为这个队列是唯一的,就和上面说的流水线一样。Swing的各个组件相当于客户,不断把各种事件(键盘或者鼠标事件,等等)塞入event queue中,queue有个专门的线程负责把这些事件送给相应的listener,就实现了最基本的事件驱动模型。如果不采用这种模型,即事件由专门线程处理的话,界面的相应速度就很差了

如果有用过Java做游戏的话,应该都接触过javax.swing.SwingUtilities这个类,里面有个invokeAndWait方法,就是用来让其他线程操作Swing组件的。为什么不能直接操作呢,如上所述,event dispatch queue是唯一的,因此Swing组件在设计时就没有过多考虑多线程的问题,反正由event dispatch queue统一操作,这样可以提高速度(尽管Swing本来就很慢),但是当其他线程要操作Swing组件时,就可能有潜在的不稳定因素,所以才有了invokeAndWait方法,调用此方法的线程会wait直到所需操作已经完成

还没说完,再仔细想想,我们在程序里也常常对那些组件直接操作而非用什么invokeAndWait,这里又有一些细节值得注意。首先是在你调用组件的setVisible等方法之前,你是可以随便改组件的,调用完setVisible之后,只有少数方法,比如repaint,addListener等等。最后,根据jdk文档所言,这个方法是用来给应用程序线程改变GUI外观的。如果非要直接改,不一定会出错,多线程本来就是比较难说的,呵呵,我也没试过,改天可以尝试一下

《java多线程设计模式 第八章Worker Thread》

public class Main { public static void main(String[] args) { Channel channel = new Channel(5); /...
  • YUWEI1989
  • YUWEI1989
  • 2014年03月13日 11:42
  • 3114

Java线程之Worker Thread Pattern

Worker Thread Pattern的参与者:1. Client(委托人)参与者    Client参与者会建立Request参与者,并传给Channel参与者。2. Channel(通路)参与...
  • derekjiang
  • derekjiang
  • 2010年01月17日 19:12
  • 2559

java 多线程 future 基本原理

/** * Date:2016年9月7日下午7:56:03 * Copyright (c) 2016, www.bwbroad.com All Rights Reserved. * */ p...
  • xuejianxinokok
  • xuejianxinokok
  • 2016年09月12日 22:23
  • 520

java 多线程等待与唤醒机制

java 并发编程网站 :http://ifeve.com/java-7-concurrency-cookbook/ 一: 1:JVM线程状态 NEW, RUNNABLE, BLOC...
  • baiducheng
  • baiducheng
  • 2017年12月25日 16:08
  • 64

Worker Thread Pattern

Worker Thread Pattern
  • qq_35580883
  • qq_35580883
  • 2017年11月30日 00:05
  • 58

C#多线程之Thread

      .NET将关于多线程的功能定义在System.Threading名称空间中,因此,如果您的程序要使用多线程,必须引用此命名空间(using System.Threading)。 我们知道,...
  • tx_yu
  • tx_yu
  • 2009年11月10日 16:50
  • 2200

多线程之extends Thread

java的多线程又多种实现方式,在这里我们通过实验来学习继承Thread的多线程实现方法。package learnIng;public class LearnThread extends Threa...
  • baidu_15113429
  • baidu_15113429
  • 2016年10月12日 16:57
  • 102

C#多线程之Thread

.NET将关于多线程的功能定义在System.Threading名称空间中,因此,如果您的程序要使用多线程,必须引用此命名空间(using System.Threading)。我们知道,在.NET中使...
  • GoodShot
  • GoodShot
  • 2011年01月17日 11:51
  • 2090

Design Pattern: Worker Thread 模式

前序:   Thread-Per-Message Pattern,是一种对于每个命令或请求,都分配一个线程,由这个线程执行工作。它将“委托消息的一端”和“执行消息的一端”用两个不同的线程来实现。该线程...
  • u013795673
  • u013795673
  • 2016年03月18日 20:36
  • 675

php 多线程 worker 类中的 collect方法

  • lijingshan34
  • lijingshan34
  • 2017年04月18日 09:31
  • 397
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:多线程之Worker Thread pattern和Swing
举报原因:
原因补充:

(最多只允许输入30个字)