Java多线程设计模式详解学习笔记九——Thread-Per-Message
来源:互联网 发布:sql语句升序降序列题 编辑:程序博客网 时间:2024/06/04 23:27
public class Main {public static void main(String[] args) {System.out.println("Main Begin");Host host = new Host();host.request(10, 'A');host.request(20, 'B');host.request(30, 'C');System.out.println("Main End");}}
public class Host {private Helper helper = new Helper();public void request(final int count, final char c) {System.out.println(" Request(" + count + "," + c + ")Begin");new Thread(new Runnable() {@Overridepublic void run() {helper.handle(count, c);}}).start();System.out.println(" Request(" + count + "," + c + ")End");}}
public class Helper {public void handle(int count, char c) {System.out.println(" Handle(" + count + "," + c + ")Begin");for (int i = 0; i < count; i++) {slowly();System.out.print(c);}System.out.println("");System.out.println(" Handle(" + count + "," + c + ")End");}private void slowly() {try {Thread.sleep(100);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}Main Begin
Request(10,A)Begin
Request(10,A)End
Request(20,B)Begin
Request(20,B)End
Request(30,C)Begin
Handle(10,A)Begin
Request(30,C)End
Main End
Handle(30,C)Begin
Handle(20,B)Begin
CBACBACABBCABACBACBCACBACABBA
Handle(10,A)End
CCBCBCBCBCBBCCBCBCBB
Handle(20,B)End
CCCCCCCCCCC
Handle(30,C)End
Thread-Per-Message解释过来就是“每个消息一个线程”,“消息委托的一端”和“执行消息的一端”会是不同的线程,也就是委托消息的线程对执行消息的线程说“这个工作交给你了”。
通过打印的信息会发现在handle方法结束前,request方法已经结束了。执行main方法的主线程,调用完host的request方法后,就马上结束了,送出“帮忙显示一下A呀”“帮忙显示一下B呀”“帮忙显示一下C呀”这些指示,自己就结束了。无论handle方法多花时间,都不会影响request方法的响应性。request方法不会等待handle方法执行完毕,而会马上退出。
提高响应性,降低延迟时间
使用Thread-Per-Message时,在Host参与者里面,会启动新的线程,因为启动线程需要花一些时间,所以对希望用来提升响应性的Thread-Per-Message Pattern而言,“handle的操作需要花的时间”与“启动线程需要花的时间”是鱼与熊掌不可兼得的关系。为了降低启动线程所花的时间可使用Worker Thread Pattern。Thread-Per-Message Pattern每次提出请求时启动一条线程,Worker Thread Pattern则预先启动足够数量的线程,重复使用这些线程,提升程序的执行性能。
使用的范围:
适合在操作顺序无所谓时使用
handle方法执行的顺序,并不一定是调用request方法的顺序。所以操作顺序有意义时,不适合使用Thread-Per-Message Pattern
不需要返回值的时候
Thread-Per-Message Pattern中,request方法不会等待handle方法执行结束,也就是说request方法拿不到handle方法的返回值。所以Thread-Per-Message Pattern只能在不需要返回值的时候使用,需要得知处理结果时可使用Future Pattern
应用在服务器的制作
为了使服务器可以处理多数的请求,可以使用Thread-Per-Message Pattern,客户端送达的请求,由主线程来接收。而实际处理该请求,则交给其他线程负责,服务器的主线程回到继续等待其他客户端请求的状态
- Java多线程设计模式详解学习笔记九——Thread-Per-Message
- Java多线程设计模式-学习笔记-Thread Per Message模式.
- java多线程设计模式之Thread-Per-Message模式
- Thread-Per-Message 模式
- Thread-Per-Message 模式
- Thread-Per-message Pattern--JAVA多线程编程模式(7)
- Java线程之Thread-Per-Message Pattern
- Java多线程设计模式详解学习笔记——Introduction1 Java语言的线程
- Java多线程设计模式详解学习笔记三——SingleThreadExecution
- Java多线程设计模式详解学习笔记四——Immutable
- Java多线程设计模式详解学习笔记五——GuardedSuppension
- Java多线程设计模式详解学习笔记六——Balking
- Java多线程设计模式详解学习笔记七——Producer-Consumer
- Java多线程设计模式详解学习笔记八——Read-Write Lock Pattern
- Thread-Per-Message Pattern
- Thread-Per-Message Pattern
- Java多线程设计模式详解学习笔记二
- java多线程设计模式笔记之Single Thread Execution
- 【iphone游戏开发】Iphone游戏开发之五:游戏场景切换,点阵字的实现和Hiero工具的利用
- 用汇编的眼光看C++(之特殊函数)
- myeclipse快捷键(快捷键不是去百度的,使自己积累的)
- Java多线程设计模式详解学习笔记八——Read-Write Lock Pattern
- Get Your Database Under Version Control
- Java多线程设计模式详解学习笔记九——Thread-Per-Message
- linux下安装tftp--问题多多
- android中adb shell常用命令及查询数据库的方法
- c语言的三个小程序
- apue2 第十章 信号:Unix/Linux信号阻塞(sigaction sigprocmask sigsuspend)
- [Android]异步任务AsyncTask使用解析
- Visual Studio调试技巧
- 针对Lobby Server卡死后补偿CashOut数据的脚本
- exchange命令行管理工具"常用操作命令