2017/10/03 学习笔记

来源:互联网 发布:j2ee服务器端高级编程 编辑:程序博客网 时间:2024/06/04 19:08

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.部分网络编程复习