- java线程的六种状态
注意运行状态——Java中的运行状态详细分为了两部分(准备和运行)
- 锁池和等待池的表层和核心
表层:抢占Synchronized关键字修饰的方法等的时候,需要获得锁,否则进入锁池,调用wait()进入等待池
核心:monitor以及两个队列。等待序列、Owner waitSet EntrySet
- 从Runnable转变为waiting状态
wait()和notify() join()
-
park() unpark()
sleep方法
wait() notify() notifyAll()
wait--释放锁、必先取得锁 notify() 先获得锁,唤醒等待同步对象的线程,并放入锁池中去竞争锁 notify()和notifyAll()会等到Synchronized代码块中代码快要执行完毕的时候才会去释放锁。
创建线程的三种方式
Callable接口 可以有返回值,通过futrueTask来进行封装
实现callable实例,传入futureTask对象,再把futureTask对象传入thread对象。
实现接口VS继承类
抽象类 VS 接口 抽象类VS普通类 抽象类可以用final修饰吗? 抽象类可以有实例方法吗?
线程池
- 线程池的三个好处
资源消耗、响应速度(当任务到达时,任务可以不需要的等到线程创建就能立即执行。)、线程可管理性(线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控)
Executor框架结构
- 任务(Runnable、Callable)
- 任务的执行Executor
- 异步计算的结果Future
- 几种线程管理器的区别
ExecutorService.下面这两个方法
submit()——异步计算的结果,返回一个FutureTask对象
execute()方法 这个不会返回对象
FutureTask对象实现了Runnable,可以创建FutrueTask,交给ExecutorService执行。
ThreadPoolExecutor类的七个重点
四个构造方法 ThreadPoolExecutor() 三个核心参数: corePoolSize maximumPoolSize workQueue keepAliveTime unit threadFactory handler
- 四种饱和策略
AbortPolicy (抛出异常拒绝新任务)
CallerRunsPolicy (调用者线程运行任务)
DiscardPolicy(直接丢弃新任务)
DiscardOldestPolicy(丢弃掉最早的未处理的任务请求)
Spring——ThreadPoolTaskExecutor
Alibaba开发手册推荐利用构造方法去构造线程池
否则:
- Fixed ThreadPool (核心和最大为指定值,确定同时并发的数量)
- SingleThreadPool (核心和最大都是1,允许请求的队列长度是Integer.MAX_VALUE)
- CachedThreadPool (核心为0,最大为max,只要有请求进来,就一直等待,等到运行为止)
- ScheduleThreadPool 核心为指定的,最大为Integer.MAX_VALUE 配合DelayedWorkQueue来执行定时任务:允许创建的线程数量为Integer.MAX_VALUE,可能会创建大量线程,造成OOM
自主创建线程池:
方式一:ThreadPoolExecutor构造函数实现 方式二 通过Executor框架的工具类Executors来实现我们可以创建的三种类型。