阻塞队列与线程池常考知识复习一网打尽

  打算复习一遍高并发相关的知识,因此在这里做一个简单的笔记。
  本篇博文都是比较基础的概念,而且比较简要,大家如果要深入理解,尽量多看一些高并发相关的书籍,如果才刚接触这一块的同学,建议学习《java并发编程从入门到精通》,这一本书入门还是很不错的!
  这里接着上一篇博文继续写!

一、阻塞队列


1.阻塞队列理解

举例:例如餐饮店顾客满了以后,有让顾客等待的地方,等待则阻塞
队列满了,生产者阻塞
队列空了,消费者阻塞

2. BolckQueue接口

BolckQueue接口继承了Collection接口,与List同级
BolckQueue接口的子类又有7个
在这里插入图片描述
重点是红色的3个,构成了线程池的底层

3.升生产者消费者级过程

以前学的是生产者消费者1.0,使用的是synchronized,wait(),notify()
这里学了个生产者消费者2.0,使用的是Lock,await(),signalAll()
后面学生产者消费者3.0,使用的是阻塞队列

4. synchronized和Lock的区别

1.synchronized是Java关键字,而Lock是API类
2.前者不用手动释放,后者需要
3.前者不可中断,后者可以中断
4.前者是非公平锁,后者可以是公平锁也可以是非公平锁,默认非公平,可以自定义设置

二、线程池

1.创建线程到底有几种方式?

四种!
1.继承Thread
2.实现Runnalbe接口
3.实现Callable接口
4.通过线程池创建线程

2. Callable接口和Runnalbe接口实现线程的区别?

通过Callable接口实现线程,有返回值,而且可以抛出异常

3.线程池

线程池含义:将多个线程维护在一个容器中。需要创建线程的时候,直接从容器中取。
作用:控制运行线程的数量、线程复用、控制最大并发数、管理线程。

4.创建线程池的五种方法,前三种最为重要

1.Executors.newFixedThreadPool(int);创建固定大小的线程池
2.Executors.newSingleThreadExecutor();创建只含一个线程的线程池
3.Executors.newCachedThreadPool();创建一个带缓冲区的线程池,线程池的数量能够根据实际需求自动调节。
4.Executors.newScheduledThreadPool()带调度的,设定一个时间参数,池子中的请求每隔一段时间执行一次
5.Executors.newWorkStealingPool是java8新增

这三个线程底层都是用的new ThreadPoolExecutor,因此线程池最核心的类是:ThreadPoolExecutor
在这里插入图片描述

5.线程池的七大参数

在这里插入图片描述
在这里插入图片描述
(上接图片)如何来拒绝接受线程。

扫描二维码关注公众号,回复: 11566149 查看本文章

6.四种拒绝策略

在这里插入图片描述

7.线程池的工作原理

在这里插入图片描述

8.死锁

死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象。

JDK开发命令来观察死锁:
jps -l定位进程号
jstack,看具体原因,会发现是死锁

猜你喜欢

转载自blog.csdn.net/fallwind_of_july/article/details/100063488