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

    }

    这种方式,监听线程会很快继续进行监听,因此更多的客户端可以发送更多的请求到服务端,服务端也变的更具响应性。这对桌面应用程序也是一样的。
相关文章
|
2天前
|
Java 调度 开发者
Java并发编程:深入理解线程池
在Java的世界中,线程池是提升应用性能、实现高效并发处理的关键工具。本文将深入浅出地介绍线程池的核心概念、工作原理以及如何在实际应用中有效利用线程池来优化资源管理和任务调度。通过本文的学习,读者能够掌握线程池的基本使用技巧,并理解其背后的设计哲学。
|
2天前
|
缓存 监控 Java
Java中的并发编程:理解并应用线程池
在Java的并发编程中,线程池是提高应用程序性能的关键工具。本文将深入探讨如何有效利用线程池来管理资源、提升效率和简化代码结构。我们将从基础概念出发,逐步介绍线程池的配置、使用场景以及最佳实践,帮助开发者更好地掌握并发编程的核心技巧。
|
3天前
|
缓存 监控 Java
java中线程池的使用
java中线程池的使用
|
3天前
|
算法 Java 数据处理
Java并发编程:解锁多线程的力量
在Java的世界里,掌握并发编程是提升应用性能和响应能力的关键。本文将深入浅出地探讨如何利用Java的多线程特性来优化程序执行效率,从基础的线程创建到高级的并发工具类使用,带领读者一步步解锁Java并发编程的奥秘。你将学习到如何避免常见的并发陷阱,并实际应用这些知识来解决现实世界的问题。让我们一起开启高效编码的旅程吧!
|
2天前
|
安全 Java UED
Java并发编程:解锁多线程的潜力
在Java的世界里,并发编程如同一场精心编排的交响乐,每个线程扮演着不同的乐手,共同奏响性能与效率的和声。本文将引导你走进Java并发编程的大门,探索如何在多核处理器上优雅地舞动多线程,从而提升应用的性能和响应性。我们将从基础概念出发,逐步深入到高级技巧,让你的代码在并行处理的海洋中乘风破浪。
|
4月前
|
数据可视化 Java 测试技术
Java 编程问题:十一、并发-深入探索1
Java 编程问题:十一、并发-深入探索
67 0
|
4月前
|
存储 设计模式 安全
Java 编程问题:十、并发-线程池、可调用对象和同步器2
Java 编程问题:十、并发-线程池、可调用对象和同步器
53 0
|
1月前
|
安全 Java 调度
解锁Java并发编程高阶技能:深入剖析无锁CAS机制、揭秘魔法类Unsafe、精通原子包Atomic,打造高效并发应用
【8月更文挑战第4天】在Java并发编程中,无锁编程以高性能和低延迟应对高并发挑战。核心在于无锁CAS(Compare-And-Swap)机制,它基于硬件支持,确保原子性更新;Unsafe类提供底层内存操作,实现CAS;原子包java.util.concurrent.atomic封装了CAS操作,简化并发编程。通过`AtomicInteger`示例,展现了线程安全的自增操作,突显了这些技术在构建高效并发程序中的关键作用。
53 1
|
2月前
|
安全 Java 开发者
Java并发编程:理解并发安全与性能优化
在当今软件开发中,Java作为一种广泛使用的编程语言,其并发编程能力显得尤为重要。本文深入探讨了Java中的并发编程,包括如何确保并发安全性以及优化并发程序的性能。通过分析常见的并发问题和解决方案,读者将能够更好地理解如何利用Java的并发工具包来构建可靠和高效的多线程应用程序。 【7月更文挑战第10天】
|
3月前
|
Java 调度
Java多线程编程与并发控制策略
Java多线程编程与并发控制策略