码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2020-01-08 00:39:13      阅读:119      评论:0      收藏:0      [点我收藏+]

标签:stream   string   valueof   this   pool   lis   import   设计   设计模式   

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

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();
    }
}

 

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

标签:stream   string   valueof   this   pool   lis   import   设计   设计模式   

原文地址:https://www.cnblogs.com/zheaven/p/12164222.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!