多进程和多线程的区别:每个进程拥有组件的一整套变量,线程则共享数据,一个程序可以同时运行多个线程,则为多线程程序。
什么是线程
线程状态
1. 新建线程
2.可运行线程
调用start方法,线程处于可运行状态,可能正在运行也可能没有运行
3. 阻塞和等待线程
暂时不活动的
4. 终止线程
线程属性
中断的状态、守护线程、未捕获异常的处理器
1. 中断线程
中断不一定要终止,只是引起注意,被中断的线程可以决定如何响应中断。
2. 守护线程
3.线程名
可以用setName方法为线程设置任何名字
4. 未捕获异常的处理器
线程的run方法不能抛出任何检查型异常,但是,非检查型异常可能会导致线程终止。
5. 线程优先级
一个线程会继承构造它的那个线程的优先级
同步
1.竞态条件
同步存取
2.竞态条件详解
3.锁对象
有两种机制可以防止并发访问一个代码块,synchronized关键字,ReentrantLock类。
重入锁,线程可以反复获得已拥有的锁
4.条件对象
线程进入临界区后发现只有满足某个条件之后才能执行。可以使用一个条件对象来管理那些已经获得了一个锁却不能有效工作的线程。
一个锁对象可以有一个或多个关联的条件对象,
等待获得锁的线程和调用了await方法的线程存在本质上的不同,线程调用await方法,进入这个条件的等待集。
5. synchronized关键字
每个对象都有一个内部锁
6.同步块
进入一个同步块,可以获得java对象的锁。
使用一个对象的锁来实现额外的原子操作,客户端锁定
7.监视器概念
8. volatile字段
volatile关键字为实例字段的同步访问提供了一种免锁机制,如果声明一个字段为volatile,编译器和虚拟机会考虑该字段可能被另一个线程并发更新。
9. final变量
除非使用锁或volatile,否则无法从多个线程安全地读取一个字段。字段声明为final时,可以安全地访问一个共享字段。
10. 原子性
对共享变量除了赋值之外并不做其他操作,可以将这些共享变量声明为volatile。
11. 死锁
12. 废弃stop和suspend方法
13. 按需初始化
14. 线程局部变量
线程安全的集合
1. 阻塞队列
生产者线程向队列插入元素,消费者线程获取元素。使用队列可以安全地从一个线程向另一个线程传递数据。
2. 高效的映射、集和队列
这些集合使用复杂的算法,允许并发地访问数据结构的不同部分尽可能减少竞争。
3. 映射条目的原子更新
4. 并发散列映射的批操作
Java API为并发散列映射提供了批操作,即使有其他线程在处理映射,这些操作也能安全执行,批操作会遍历映射,处理遍历过程中找到的元素。
5. 并发集视图
想要一个很大的线程安全的集而不是映射
6. 写时拷贝数组
7. 并行数组算法
8. 较早的线程安全集合
任务和线程池
线程池中包含许多准备允许的线程,为线程池提供一个Runable,会有一个线程调用run方法,当run方法退出时,这个线程不会死亡,会留在池中为下一个请求提供服务。
1. Callable与Future
Runable封装了一个异步运行的任务,没有参数和返回值的异步方法。Callable有返回值,Callable接口是一个参数化类型,只有一个方法call.
Future保存异步计算的结果
2.执行器
执行器类有许多用来构造线程池的静态工厂方法
3. 控制任务组
invokeAny方法提交一个Callable对象集合中的所有对象,并返回某个已经完成任务的结果。
invokeAll方法提交一个Callable对象集合中的所有对象,这个方法会阻塞,直到所有任务都完成,并返回表示所有任务答案的一个Future对象列表。
4. fork-join框架
有些应用使用了大量线程,但大多数都是空闲的。
异步计算
1.可完成Future
如果有一个Future对象,需调用get来获得值,这个方法会阻塞,直到值可用。CompletableFuture类实现了Future接口,它提供了获得结果的另一种机制。你要注册一个回调(callback),一旦结果可用,就会(在某个线程中)利用该结果调用。
2.组合可完成Future
3.用户界面回调中的长时间运行任务
使用线程是为了提高程序的响应性。当程序需要做某些耗时的工作时,不能在用户界面线程完成这些工作,应该启动另一个工作线程。如果工作线程要执行长时间运行的任务,就不要从这样一个工作线程更新用户界面。
进程
执行另一个程序,使用ProcessBuilder和Process类