• 多线程的Thread-Per-Message设计模式


    思路:一个请求创建一个线程

    Message消息体

    package com.dwz.concurrency2.chapter16;
    
    public class Message {
        private final String value;
    
        public Message(String value) {
            this.value = value;
        }
    
        public String getValue() {
            return value;
        }
    }

    handler简单版(有几个请求创建一个线程)

    package com.dwz.concurrency2.chapter16;
    import java.util.Random;
    public class MessageHandler { private final static Random random = new Random(System.currentTimeMillis()); public void request(Message message) { new Thread(() -> { String value = message.getValue(); try { Thread.sleep(random.nextInt(1000)); System.out.println("The message will be handle by " + Thread.currentThread().getName()); } catch (InterruptedException e) { e.printStackTrace(); } }).start(); } }

    handler改进版(使用线程池创建线程)

    package com.dwz.concurrency2.chapter16;
    
    import java.util.Random;
    import java.util.concurrent.Executor;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    public class MessageHandler {
        private final static Random random = new Random(System.currentTimeMillis());
        
        private final static Executor executor = Executors.newFixedThreadPool(5);
        
        public void request(Message message) {
            executor.execute(() -> {
                String value = message.getValue();
                try {
                    Thread.sleep(random.nextInt(1000));
                    System.out.println("The message will be handle by " + Thread.currentThread().getName() + " " + value);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
        
        public void shutdown() {
            ((ExecutorService) executor).shutdown();
        }
    }

    测试

    package com.dwz.concurrency2.chapter16;
    
    import java.util.stream.IntStream;
    
    public class PerThreadClient {
        public static void main(String[] args) {
            final MessageHandler handler = new MessageHandler();
            IntStream.rangeClosed(0, 10).forEach(i -> handler.request(new Message(String.valueOf(i))));
            handler.shutdown();
        }
    }
  • 相关阅读:
    wepy框架构建小程序(1)
    百度地图2
    百度地图1
    VS Code 用户自定义代码片段(React)
    JS MarcoTasks MicroTasks
    JS位运算和遍历
    VueX源码分析(5)
    VueX源码分析(4)
    tensorflow 自带的实现函数翻转的函数
    namedtuple
  • 原文地址:https://www.cnblogs.com/zheaven/p/12164222.html
Copyright © 2020-2023  润新知