1.Thread的六大状态
首先通过NewThread创建
调用Start方法去让线程进入可运行状态(Runable),但是什么时候运行由系统决定。
通过wait sleep方法可以进入WaitingTimed状态,类似的还有Waiting状态
请求锁进入阻塞状态(Blocked)
结束状态
2.线程的两种创建方式
(1).直接继承Thread实现Run方法(其实Thread也是Runable的一个实例)
(2).实现Runable接口,实现run方法,创建Thread将新建的Runbale作为参数传入
3.线程中断
通过interrupt方法设置中断标识,设置完成并不会中断线程,线程会时不时该标识位,该标识当线程进入阻塞状态时会被重置状态,并抛出异常
4.安全的终止线程
异常中断的错误由方法直接抛出,并根据中断标识或者自定义的标志位来安全停止线程
5.线程同步
重入锁+条件对象(Condition)
条件对象的await方法可以使线程进入阻塞状态,signalAll方法可以使其它被该条件对象阻塞住的线程停止阻塞状态
6.同步方法 Synchronized 关键字
作用相当于上面的重入锁+条件对象,更轻量,它的wait方法相当于await,notifyAll相当于SignallAll,该字段保证了操作的原子性,可见性,防止在对一个数据进行更改后还未同步到公共存储区域就被打断。
7.同步代码块
一般不推荐使用
8.Volatile关键字
由于该字段不保证操作的原子性,会导致线程之间数据同步出现问题,因此比较少使用,有一个使用场景时,线程一要改变线程二中的一个Boolean这种标识位的时候,可以使用该操作去进行修饰。
9.阻塞队列
七种常见的阻塞队列。
阻塞流程 拿put方法举例,启动线程,判断当前任务数量和队列数量上限,如果队列已经达到上限,则调用put方法对应的条件对象(Condition)的await方法阻塞线程,否则进入下一方法进行put操作,并调用该条件对象的signalAll方法解锁其它进行此操作的线程。
10.线程池
Executor框架下的ThreadPoolExecutor类
整个线程池的总体处理流程为
调用execute方法创建线程
判断核心线程数量是否到达上限,没到达就创建新的核心线程处理任务
核心线程数量到达上限,判断任务队列(阻塞队列)是否到达上限,没到达就塞入任务队列
任务队列数量到达上限,再判断是否到达线程池最大线程个数,没到达就创建非核心线程处理任务。
到达了就执行饱和策略,默认是跑出异常并不去处理该任务。
明天计划:
1.Synchronized 深入了解
2.AsyncTask原理
3.部分网络编程复习