文章目录
并发编程领域的问题总结为三个核心问题:分工、同步和互斥。其中,同步和互斥相关问题更多地源自微观,而分工问题则是源自宏观。我们解决问题,往往都是从宏观入手,解决分工问题也有一系列的设计模式,比较常用的主要有 Thread-Per-Message 模式、Worker Thread 模式、生产者 - 消费者模式。比如写一个 HTTP 服务,如果在主线程中处理 HTTP 请求的话,那同一时间只能处理一个请求,太慢了!可以利用代办的思路,创建一个子线程,委托子线程去处理 HTTP 请求。这种委托他人办理的方式,在并发编程领域被总结为一种设计模式,叫做 Thread-Per-Message 模式,
final ServerSocketChannel ssc = ServerSocketChannel.open().bind(new InetSocketAddress(8080));// 处理请求
try {
while (true) {
// 接收请求
SocketChannel sc = ssc.accept();
// 每个请求都创建一个线程
new Thread(()->{
try {
// 读 Socket
ByteBuffer rb = ByteBuffer
.allocateDirect(1024);
sc.read(rb);
// 模拟处理请求
Thread.sleep(2000);
// 写 Socket
ByteBuffer wb =
(ByteBuffer)rb.flip();
sc.write(wb);
// 关闭 Socket
sc.close();
}catch(Exception e){
throw new UncheckedIOException(e);
}
}).start();
}
} finally {
ssc.close();
}
总结
并发编程领域的分工问题,指的是如何高效地拆解任务并分配给线程。
Thread-Per-Message 模式在java中用得不多,根本原因在于 Java 语言里的线程是一个重量级的对象,为每一个任务创建一个线程成本太高,尤其是在高并发领域,基本就不具备可行性。对于一些并发度没那么高的异步场景,例如定时任务,采用 Thread-Per-Message 模式是完全没有问题的。
多线程系列在github上有一个开源项目,主要是本系列博客的实验代码。
https://github.com/forestnlp/concurrentlab
如果您对软件开发、机器学习、深度学习有兴趣请关注本博客,将持续推出Java、软件架构、深度学习相关专栏。
您的支持是对我最大的鼓励。
本文探讨了并发编程中的分工问题,重点介绍了Thread-Per-Message模式的应用,以及为何在Java中较少使用。通过实例展示了如何通过创建子线程处理HTTP请求,同时提到了适用于不同并发场景的其他设计模式。
213

被折叠的 条评论
为什么被折叠?



