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