多线程之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(线程池)

想象一个场景,一个工厂在生产玩具,在一个车间里,有几个工人,每次生产部件准备好车间外的人就将部件放到车间的一个桌子上,工人每次做完一个玩具就从桌子上取部件。在这里,注意到,部件并不是直接交给工人的,另...

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

public class Main { public static void main(String[] args) { Channel channel = new Channel(5); /...

Java多线程之 Thread VS Runnable 【带案例】

为此,我们举个例子,假设有火车站有三个窗口,在卖火车票,总共只有5张票。每一个线程相当于一个窗口,分别售票 package com.thread; class myThread extends T...

黑马程序员——多线程之Runnable与Thread

------http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 一、...

JAVA多线程之Thread&&Runnable

看了个视频,嗯,记录下加深下理解。。。java实现多线程的两种方式:继承thread类,这种方式的缺陷就是java的单继承导致的;还有一种方式就是实现Runnable接口,这种方式避免了thread方...
  • z_zT_T
  • z_zT_T
  • 2016年08月01日 09:48
  • 1821

多线程之Thread--JAVA

@java笔记原来对多线程理解不多,所以整理笔记加深多多线程的理解,同时也方便日后的学习、复习!!希望可以共同交流,一起进步!首先看一下线程与进程的区别(在java面试或者android面试中经常会问...
  • zdx_05
  • zdx_05
  • 2016年01月26日 16:32
  • 245

IOS学习笔记49--多线程之Thread

每个iOS应用程序都有个专门用来更新显示UI界面、处理用户的触摸事件的主线程,因此不能将其他太耗时的操作放在主线程中执行,不然会造成主线程堵塞(出现卡机现象),带来极坏的用户体验。一般的解决方案就是将...

Java多线程之Thread VS Runnable(根据慕课网视频编写)

线程创建的两种方式比较 继承Thread类:class MyThread extends Thread{ ...... @Override public void run()...

JAVA多线程之Runnable和Thread比较

在我们开发的过程中常常会碰到多线程的问题,对于多线程的实现方式主要有两种:实现Runnable接口、继承Thread类。对于这两种多线程的实现方式也是有着一些差异。既然实现了多线程那必然离不开管理这些...

java多线程之守护线程(daemon thread)

转载请注明出处 http://blog.csdn.net/pony_maggie/article/details/42402657 作者:小马 daemon是相于user线程而言的,可以...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:多线程之Worker Thread pattern和Swing
举报原因:
原因补充:

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