并发编程 Thread-Per-Message模式

本文将介绍并发编程中的 Thread-Per-Message 模式,它是一种最简单的分工方式。

一、什么是 Thread-Per-Message 模式?

Thread-Per-Message,即一个 Thread 一个 Message,为每个任务分配一个独立的线程,它是一种最简单的分工方式。

二、示例 - echo

Thread-Per-Message 模式的一个最经典的应用场景是网络编程中服务端的实现,服务端会被每个请求创建一个独立的线程,当线程处理完请求后,自动销毁。

下面将展示网络编程中最简单的 echo 程序,它将原封不动地返回请求,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
final ServerSocketChannel serverSocketChannel = ServerSocketChannel.open().bind(new InetSocketAddress(8080));
try {
while (true) {
// 接收请求
SocketChannel socketChannel = serverSocketChannel.accept();
// 创建线程处理请求
new Thread(() -> {
try {
// 读
ByteBuffer readBuffer = ByteBuffer.allocateDirect(1024);
socketChannel.read(readBuffer);
//模拟处理请求
Thread.sleep(2000);
// 写
ByteBuffer writeBuffer = (ByteBuffer)readBuffer.flip();
socketChannel.write(writeBuffer);
// 关闭Socket
socketChannel.close();
} catch(Exception e) {
throw new UncheckedIOException(e);
}
}).start();
}
} finally {
serverSocketChannel.close();
}

三、说明

在 Java 中,线程与操作系统线程一一对应,这导致线程是一个重量级的对象,其创建成本很高(创建耗时多、占用内存大),因此不建议使用该模式。

参考

  • Java 并发编程实战