zoukankan      html  css  js  c++  java
  • 多线程的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();
        }
    }
  • 相关阅读:
    ETL讲解(很详细!!!)
    必须掌握的30种SQL语句优化
    亿级Web系统搭建——单机到分布式集群
    运行第一个容器
    Docker 架构详解
    容器 What, Why, How
    Docker 组件如何协作?
    部署 DevStack
    通过例子学习 Keystone
    创建 Image
  • 原文地址:https://www.cnblogs.com/zheaven/p/12164222.html
Copyright © 2011-2022 走看看