多线程的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();
    }
}

 

你可能感兴趣的:(多线程的Thread-Per-Message设计模式)