Thread- Per-Message模式 Thread- Per-Message直译过来就是每个消息一个线程的意思,Message可以理解为命令或者请求,为每个命令或者请求新分配一个线程,由这个线程来执行处理——这就是Thread- Per-Message模式。在模式中,消息的“委托端”和“执行端”是不同的线程,消息的委托端线程会告诉执行端线程“这项工作就交给你了”。 下面咱们通过示例来清晰地认识一下:在下面程序中,main类委托Host类来显示字符,Host类会创建并启动一个线程,来处理该委托。启动的线程使用Helper类来执行实际的显示。 Main类会先创建一个Host类的实例,然后调用Host的request方法,下面的处理语句含义是显示10次字符A。 Host.request(10,’A’); 为了了解线程的运行状况,我们加上程序起始标识。 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"); } } Host类的request方法新启动一个线程,实际操作将由该线程来执行。 public class Host { private final Helper helper = new Helper(); public void request(final int count,final char c) { System.out.println(" request("+count+","+ c +") BEGIN"); new Thread() { public void run() { helper.handle(count, c); } }.start(); System.out.println(" request("+count+","+ c +") END"); } } Help类提供了一个用于按指定次数显示字符的handle方法。另外,为了延缓显示速度(即为了表示handle操作很费时间),我们在slowly方法中使用了Thread.sleep。 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.println(c); } System.out.println(""); System.out.println(" handle("+count+","+ c +") END"); } private void slowly() { try { Thread.sleep(100); } catch (InterruptedException e) { } } } 运行结果会发现,在handle方法调用结束之前,request方法就已经终止了。 执行main方法的主线程在连续调用host的request方法之后,就会立即终止,在发出“请帮忙显示A”“请帮忙显示B”“请帮忙显示C”这些指示之后,主线程就可以终止了。不管handle方法的处理花费多长时间,都不会影响request方法的响应性。这是因为,request方法并不会等待handle方法执行结束,而是立即返回。 时序图如下:
|