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

怎甘沉沦 提交于 2020-01-07 23:28:31

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

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

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!