Java并发/多线程教程——2多线程的优点

简介: Java并发/多线程教程
本系列译自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

    }

    这种方式,监听线程会很快继续进行监听,因此更多的客户端可以发送更多的请求到服务端,服务端也变的更具响应性。这对桌面应用程序也是一样的。
相关文章
|
11天前
|
NoSQL Java 关系型数据库
Liunx部署java项目Tomcat、Redis、Mysql教程
本文详细介绍了如何在 Linux 服务器上安装和配置 Tomcat、MySQL 和 Redis,并部署 Java 项目。通过这些步骤,您可以搭建一个高效稳定的 Java 应用运行环境。希望本文能为您在实际操作中提供有价值的参考。
72 26
|
14天前
|
安全 算法 Java
Java多线程编程中的陷阱与最佳实践####
本文探讨了Java多线程编程中常见的陷阱,并介绍了如何通过最佳实践来避免这些问题。我们将从基础概念入手,逐步深入到具体的代码示例,帮助开发者更好地理解和应用多线程技术。无论是初学者还是有经验的开发者,都能从中获得有价值的见解和建议。 ####
|
17天前
|
安全 Java 编译器
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
|
14天前
|
Java 调度
Java中的多线程编程与并发控制
本文深入探讨了Java编程语言中多线程编程的基础知识和并发控制机制。文章首先介绍了多线程的基本概念,包括线程的定义、生命周期以及在Java中创建和管理线程的方法。接着,详细讲解了Java提供的同步机制,如synchronized关键字、wait()和notify()方法等,以及如何通过这些机制实现线程间的协调与通信。最后,本文还讨论了一些常见的并发问题,例如死锁、竞态条件等,并提供了相应的解决策略。
38 3
|
17天前
|
Java 开发工具 Android开发
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
|
20天前
|
安全 Java 开发者
Java中的多线程编程:从基础到实践
本文深入探讨了Java多线程编程的核心概念和实践技巧,旨在帮助读者理解多线程的工作原理,掌握线程的创建、管理和同步机制。通过具体示例和最佳实践,本文展示了如何在Java应用中有效地利用多线程技术,提高程序性能和响应速度。
54 1
|
17天前
|
Java 数据库连接 编译器
Kotlin教程笔记(29) -Kotlin 兼容 Java 遇到的最大的“坑”
Kotlin教程笔记(29) -Kotlin 兼容 Java 遇到的最大的“坑”
34 0
|
2月前
|
存储 消息中间件 资源调度
C++ 多线程之初识多线程
这篇文章介绍了C++多线程的基本概念,包括进程和线程的定义、并发的实现方式,以及如何在C++中创建和管理线程,包括使用`std::thread`库、线程的join和detach方法,并通过示例代码展示了如何创建和使用多线程。
58 1
C++ 多线程之初识多线程
|
2月前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
27 3
|
2月前
|
Java 开发者
在Java多线程编程中,选择合适的线程创建方法至关重要
【10月更文挑战第20天】在Java多线程编程中,选择合适的线程创建方法至关重要。本文通过案例分析,探讨了继承Thread类和实现Runnable接口两种方法的优缺点及适用场景,帮助开发者做出明智的选择。
23 2
下一篇
DataWorks