A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

Thread- Per-Message模式
Thread- Per-Message直译过来就是每个消息一个线程的意思,Message可以理解为命令或者请求,为每个命令或者请求新分配一个线程,由这个线程来执行处理——这就是Thread- Per-Message模式。在模式中,消息的“委托端”和“执行端”是不同的线程,消息的委托端线程会告诉执行端线程“这项工作就交给你了”。
下面咱们通过示例来清晰地认识一下:在下面程序中,main类委托Host类来显示字符,Host类会创建并启动一个线程,来处理该委托。启动的线程使用Helper类来执行实际的显示。
Main类会先创建一个Host类的实例,然后调用Hostrequest方法,下面的处理语句含义是显示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方法的主线程在连续调用hostrequest方法之后,就会立即终止,在发出“请帮忙显示A”“请帮忙显示B”“请帮忙显示C”这些指示之后,主线程就可以终止了。不管handle方法的处理花费多长时间,都不会影响request方法的响应性。这是因为,request方法并不会等待handle方法执行结束,而是立即返回。
时序图如下:



1 个回复

倒序浏览
一个人一座城0.0 来自手机 中级黑马 2018-11-28 14:04:05
沙发
到此一游。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马