目录
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被用来创建&管理系统中的所有任务。