Java 并发/多线程教程(二)-多线程的优点

简介:         本系列译自jakob jenkov的Java并发多线程教程,个人觉得很有收获。由于个人水平有限,不对之处还望矫正!      尽管多线程有诸多的挑战,但是多线程被广泛使用的原因有以下几点:1、对资源的充分利用。

        本系列译自jakob jenkov的Java并发多线程教程,个人觉得很有收获。由于个人水平有限,不对之处还望矫正!

     尽管多线程有诸多的挑战,但是多线程被广泛使用的原因有以下几点:

1、对资源的充分利用。

2、简化程序设计

3、响应的及时性

资源的充分利用

       假设一个应用程序从本地文件系统中读取并处理一个文件,让我们来假设从硬盘读取文件需要5秒,处理文件需要两秒,那么处理两个文件则需要:

5秒 读取A文件

2秒 处理A文件

5秒 读取B文件

2秒 处理B文件

共需14秒

当从硬盘读取文件的时候,CPU大部分时间用在等待从硬盘读取数据,CPU 在等待的这段时间是非常空闲的,是可以被利用来做其他事情的,通过改变执行顺序,CPU 可以被更好的利用。看下面的执行顺序:

5秒  读取A文件

5秒 读取B文件+2秒处理A文件

2秒 处理B文件

共需12秒

到CPU等待A文件读取的时候,开始读取B文件,当B文件正在读取的时候,CPU 开始处理A文件,记住,当CPU 等待从硬盘读取文件的时候,CPU 几乎是空闲的。

通常,CPU 在等待IO操作时,可以做其他的事情的,不光是磁盘IO,网络IO也是一样的

简化程序设计

如果你打算用一个单线程的程序去处理上面的问题,你不得不时刻跟踪每个文件的读取和处理状态。而用多线程,你只需要启动两个线程,而每个线程只需负责单个文件读取和处理。这些线程会被blocked当等待从磁盘上读取文件,在等待的同时,另外的线程可以利用CPU 来处理它已经读到的数据,这样做的结果就是,磁盘一直处于繁忙的状态,不断地从磁盘读取数据到内存中。这样做,对于磁盘和CPU 的利用率得到提升,同时对于程序来说也更简单,因为每个线程只需去跟踪一个文件的读取和处理状态

响应的及时性

将单线程转变为多线程的另一个目的是更具有响应的及时性。假设一个服务端程程序在一个端口上监听请求,当收到请求后,它对这个请求进行相应的处理,然后再返回去监听另外的请求。服务端程序如下:

while(server is active){

   listen for the request

   process request

}

如果这个请求花费了很长的时间去处理,那么客户端就不能在此期间发送任何请求到服务端,只有当服务端处理完当前请求再次回到监听时才能接受新的请求。另一种设计是监听线程把接受到的请求交给工作线程(work  thread )然后立即返回监听。工作线程会对请求进行处理,并对客户端返回一个结果。这种设计模式如下:

while(server is active){

listen for request

handle request to work thread

}

这种方式,监听线程会很快继续进行监听,因此更多的客户端可以发送更多的请求到服务端,服务端也变的更具响应性。这对桌面应用程序也是一样的。

目录
相关文章
|
3天前
|
Python
python3多线程中使用线程睡眠
本文详细介绍了Python3多线程编程中使用线程睡眠的基本方法和应用场景。通过 `time.sleep()`函数,可以使线程暂停执行一段指定的时间,从而控制线程的执行节奏。通过实际示例演示了如何在多线程中使用线程睡眠来实现计数器和下载器功能。希望本文能帮助您更好地理解和应用Python多线程编程,提高程序的并发能力和执行效率。
32 20
|
9天前
|
安全 Java C#
Unity多线程使用(线程池)
在C#中使用线程池需引用`System.Threading`。创建单个线程时,务必在Unity程序停止前关闭线程(如使用`Thread.Abort()`),否则可能导致崩溃。示例代码展示了如何创建和管理线程,确保在线程中执行任务并在主线程中处理结果。完整代码包括线程池队列、主线程检查及线程安全的操作队列管理,确保多线程操作的稳定性和安全性。
|
2月前
|
NoSQL Redis
单线程传奇Redis,为何引入多线程?
Redis 4.0 引入多线程支持,主要用于后台对象删除、处理阻塞命令和网络 I/O 等操作,以提高并发性和性能。尽管如此,Redis 仍保留单线程执行模型处理客户端请求,确保高效性和简单性。多线程仅用于优化后台任务,如异步删除过期对象和分担读写操作,从而提升整体性能。
79 1
|
3月前
|
存储 安全 Java
Java多线程编程中的并发容器:深入解析与实战应用####
在本文中,我们将探讨Java多线程编程中的一个核心话题——并发容器。不同于传统单一线程环境下的数据结构,并发容器专为多线程场景设计,确保数据访问的线程安全性和高效性。我们将从基础概念出发,逐步深入到`java.util.concurrent`包下的核心并发容器实现,如`ConcurrentHashMap`、`CopyOnWriteArrayList`以及`BlockingQueue`等,通过实例代码演示其使用方法,并分析它们背后的设计原理与适用场景。无论你是Java并发编程的初学者还是希望深化理解的开发者,本文都将为你提供有价值的见解与实践指导。 --- ####
|
3月前
|
存储 设计模式 分布式计算
Java中的多线程编程:并发与并行的深度解析####
在当今软件开发领域,多线程编程已成为提升应用性能、响应速度及资源利用率的关键手段之一。本文将深入探讨Java平台上的多线程机制,从基础概念到高级应用,全面解析并发与并行编程的核心理念、实现方式及其在实际项目中的应用策略。不同于常规摘要的简洁概述,本文旨在通过详尽的技术剖析,为读者构建一个系统化的多线程知识框架,辅以生动实例,让抽象概念具体化,复杂问题简单化。 ####
|
3月前
|
Java 数据库连接 数据库
如何构建高效稳定的Java数据库连接池,涵盖连接池配置、并发控制和异常处理等方面
本文介绍了如何构建高效稳定的Java数据库连接池,涵盖连接池配置、并发控制和异常处理等方面。通过合理配置初始连接数、最大连接数和空闲连接超时时间,确保系统性能和稳定性。文章还探讨了同步阻塞、异步回调和信号量等并发控制策略,并提供了异常处理的最佳实践。最后,给出了一个简单的连接池示例代码,并推荐使用成熟的连接池框架(如HikariCP、C3P0)以简化开发。
89 2
|
4月前
|
Java 开发者
在Java多线程编程中,选择合适的线程创建方法至关重要
【10月更文挑战第20天】在Java多线程编程中,选择合适的线程创建方法至关重要。本文通过案例分析,探讨了继承Thread类和实现Runnable接口两种方法的优缺点及适用场景,帮助开发者做出明智的选择。
43 2
|
4月前
|
Java
Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口
【10月更文挑战第20天】《JAVA多线程深度解析:线程的创建之路》介绍了Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口。文章详细讲解了每种方式的实现方法、优缺点及适用场景,帮助读者更好地理解和掌握多线程编程技术,为复杂任务的高效处理奠定基础。
68 2
|
3月前
|
数据采集 Java Python
爬取小说资源的Python实践:从单线程到多线程的效率飞跃
本文介绍了一种使用Python从笔趣阁网站爬取小说内容的方法,并通过引入多线程技术大幅提高了下载效率。文章首先概述了环境准备,包括所需安装的库,然后详细描述了爬虫程序的设计与实现过程,包括发送HTTP请求、解析HTML文档、提取章节链接及多线程下载等步骤。最后,强调了性能优化的重要性,并提醒读者遵守相关法律法规。
118 0
|
安全 Java 程序员
4月7日云栖精选夜读:给 Java 学习者的超全教程整理
作为Java程序员的我们,应该不仅对这门语言有所了解,而且我们在平常编程时也需要使用众多的库。比如小编知道的,如果要学习Java Web的话,SSH(Spring, Struts和Hibernate)肯定得会吧,或者至少了解基本的原理吧。
2779 0