分析
- 每個消息一個線程。message可以理解爲命令,請求。爲
每一個請求新分配一個線程,由這個線程來執行處理
。 - Thread-Per-Message模式中,請求的委託端和請求的執行端是不同的線程,請求的委託端會告訴請求的執行端線程:這項工作就交給你了
編碼
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(Thread.currentThread() + " 處理這個" + value);
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
}
}
測試:
public class PerThreadClient {
public static void main(String[] args) {
final MessageHandler messageHandler = new MessageHandler();
IntStream.rangeClosed(1, 5)
.forEach(
i -> messageHandler.request(new Message(String.valueOf(i)))
);
}
}
結果
Thread[Thread-0,5,main] 處理這個1
Thread[Thread-2,5,main] 處理這個3
Thread[Thread-3,5,main] 處理這個4
Thread[Thread-1,5,main] 處理這個2
Thread[Thread-4,5,main] 處理這個5
- 但是這樣會頻繁的創建和銷燬線程,影響性能
- 所以可以使用線程池
使用線程池
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(Thread.currentThread() + " 處理這個" + value);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
}