《JAVA编程思想》学习笔记:第21章(并发)

目录
Java编程思想(一)第1~4章:概述
Java编程思想(二)第5章:初始化和清理
Java编程思想(三)第6章:访问权限
Java编程思想(四)第7章:复用类
Java编程思想(五)第8章:多态
Java编程思想(六)第9章:接口
Java编程思想(七)第10章:内部类
Java编程思想(八)第11章:持有对象
Java编程思想(九)第12章:异常
Java编程思想(十)第13章:字符串
Java编程思想(十一)第14章:类型信息
Java编程思想(十二)第15章:泛型
Java编程思想(十三)第16章:数组
Java编程思想(十四)第17章:深入研究容器
Java编程思想(十五)第18章:Java I/O系统
Java编程思想(十六)第19章:枚举
Java编程思想(十七)第20章:注解
Java编程思想(十八)第21章:并发

第二十章、并发

前言

  • 顺序编程:即程序中的所有事物在任意时刻都只能执行一个步骤。
  • 并发编程:程序能够并行地执行程序中的多个部分。

21.1 并发的多面性

并发编程的难点:

  • 并发需要解决的问题有多个;实现并发的方式有多种;
  • 并且,上述两者之间没有明确的映射关系。

21.1.1 更快的执行

  • 并发目的:通常是为了提高运行在单处理器上的程序性能;
  • 并发实现1:最直接的方式是操作系统级别使用进程;
  • 并发实现2:Java采用的是更加传统的方式:在顺序型语言的基础上提供对线程的支持。

并发和并行的区别:

  • 并发:轮流处理多个任务:其实是按顺序执行的,cpu在任一时间只执行一个线程,通过给不同线程分配时间段的形式来进行调度,只是看起来好像多个任务是同时执行的;
  • 并行:同时处理多个任务:就是多个任务同一时刻在同时进行;

21.1.2 改进代码设计

  • 抢占式线程机制:调度机制会周期性的中端线程,将上下文切换到另一个线程,从而为每个线程提供时间片,使得每个线程都会分配到数量合理的时间去驱动它的任务。
  • 非抢占线程机制:每个线程可以需要CPU多少时间就占用CPU多少时间。在这种调度方式下,可能一个执行时间很长的线程使得其他所有需要CPU的线程”饿死”。在处理机空闲,即该进程没有使用CPU时,系统可以允许其他的进程暂时使用CPU。占用CPU的线程拥有对CPU的控制权,只有它自己主动释放CPU时,其他的线程才可以使用CPU。
  • 线程机制的选择:Java采用的是抢占式线程机制。

21.2 基本的线程机制

  • 并发编程:使得我们可以将程序划分为多个分离的、独立运行的任务。
  • 多线程机制:通过多线程机制,这些独立子任务中的每一个都将由执行线程驱动;

21.2.1 定义任务

  • 任务:线程可以驱动任务,因此你需要一种描述任务的方式,这可以由Runnable接口来提供。要想定义任务,只需实现Runnable接口并编写run()方法,使得该任务可以执行你的命令。
  • 线程执行:当从Runnable导出一个类时,它必须具有run()方法,但是这个方法并无特殊之处。它不会产生任何内在的线程能力。要实现线程行为,你必须显式地将一个任务附着到线程上。

21.2.2 Thread类(线程)

  • 任务执行:将Runnable对象转变为工作任务的传统方式是把它提交给一个Thread的构造器(作为参数传入)

21.2.3 使用Executor

  • Executor(执行器):Java SE5的 java.util.concurrent包中定义的执行器,用作管理 Thread对象,从而简化并发编程。并在客户端和任务执行之间提供了间接层;
  • Executor:允许你管理异步任务的执行,而无须显示的管理线程的生命周期;非常常见的场景:单个Executor被用来创建&管理系统中的所有任务。
发布了223 篇原创文章 · 获赞 73 · 访问量 96万+

猜你喜欢

转载自blog.csdn.net/cbk861110/article/details/104120458