美文网首页
Thread-Per-Message模式

Thread-Per-Message模式

作者: youngxinler | 来源:发表于2019-07-05 20:46 被阅读0次

    适用的情况

    解决一个请求会花费比较长的时间, 这时候程序的主进程的控制权一直会被当前请求所占用, 其他的请求也无法进行处理.

    实现的方式

    在接收请求的主线程方法中, 另外开启一个线程, 让新开启的线程对该请求进行处理, 这时候, 接收请求的主线程不会被阻塞到.

    相关的模式

    代码示例:

    Host接收请求, 然后开启新的线程进行任务的处理, (字符串输出, 为了模拟正常情况下, 进行Thread.sleep()阻塞).

    package com.graphic.threadPerMessage;
    
    /**
     * @author youngxinler  19-6-2 上午10:09
     * @version 0.1
     **/
    
    public class Helper {
        public void handle(int count, char c) {
            System.out.println("    handle begin " + c);
            for (int i = 0; i < count; i++) {
                slowly();
                System.out.print(c);
            }
            System.out.println();
            System.out.println("    handle end " + c);
        }
    
        private void slowly() {
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    
    
    package com.graphic.threadPerMessage;
    
    /**
     * @author youngxinler  19-6-2 上午10:17
     * @version 0.1
     **/
    
    
    public class Host {
        private final Helper helper = new Helper();
    
        public Host() {
        }
    
        //如果内部类使用了方法参数, 那么必须对参数加上final, 否则会报错
        public void request(final int count, final char c){
            System.out.println("request begin " + count + " " + c);
    
            //  每个request 委托新的线程去执行
            // 适合如果处理的时间特别长, 而且对操作顺序和返回值没有要求
            new Thread(){
                @Override
                public void run(){
                    helper.handle(count, c);
                }
            }.start();
            System.out.println("request end " + count + " " + c);
        }
    }
    
    package com.graphic.threadPerMessage;
    
    import java.util.concurrent.Executors;
    import java.util.concurrent.ScheduledExecutorService;
    
    /**
     * @author youngxinler  19-6-2 上午10:20
     * @version 0.1
     **/
    
    public class Main {
        public static void main(String[] args) {
            Host host = new Host();
                    try {
                host.request(50, 'A');
                host.request(50, 'B');
                host.request(50, 'C');
            } finally {
                System.out.println("main end");
            }
        }
    }
    

    点我,12种Java多线程设计模式, 希望能帮到你

    相关文章

      网友评论

          本文标题:Thread-Per-Message模式

          本文链接:https://www.haomeiwen.com/subject/nmryhctx.html