5-30提前批冲刺

72 阅读2分钟

- 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对象。 image.png

实现接口VS继承类

抽象类 VS 接口 抽象类VS普通类 抽象类可以用final修饰吗? 抽象类可以有实例方法吗?

线程池

- 线程池的三个好处

资源消耗、响应速度(当任务到达时,任务可以不需要的等到线程创建就能立即执行。)、线程可管理性(线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控)

Executor框架结构

  • 任务(Runnable、Callable)
  • 任务的执行Executor
  • 异步计算的结果Future
  • 几种线程管理器的区别

image.png ExecutorService.下面这两个方法 submit()——异步计算的结果,返回一个FutureTask对象 execute()方法 这个不会返回对象 FutureTask对象实现了Runnable,可以创建FutrueTask,交给ExecutorService执行。

ThreadPoolExecutor类的七个重点

四个构造方法 ThreadPoolExecutor() 三个核心参数: corePoolSize maximumPoolSize workQueue keepAliveTime unit threadFactory handler

  • 四种饱和策略 AbortPolicy (抛出异常拒绝新任务)
    CallerRunsPolicy (调用者线程运行任务)

image.png 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来实现我们可以创建的三种类型。

image.png

image.png