创建线程的三种方式
- 实现runable接口,重写run方法
- 继承Thread类,重写run方法
- 实现Callable接口,重写call方法
四种线程池的创建和使用场景
线程池的作用:实现线程复用
线程池的流程图
- newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
- newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
- newScheduledThreadPool 创建一个可定期或者延时执行任务的定长线程池,支持定时及周期性任务执行。
newCachedThreadPool 创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
线程的配置
四种线程池本质都是创建ThreadPoolExecutor类,ThreadPoolExecutor构造参数如下
int corePoolSize, 核心线程大小
- int maximumPoolSize,最大线程大小
- long keepAliveTime, 超过corePoolSize的线程多久不活动被销毁时间
- TimeUnit unit,时间单位
- BlockingQueue
workQueue 任务队列 - ThreadFactory threadFactory 线程池工厂
RejectedExecutionHandler handler 拒绝策略
阻塞队列
ArrayBlockingQueue :一个由数组结构组成的有界阻塞队列
- LinkedBlockingQueue :一个由链表结构组成的有界阻塞队列(常用)
- PriorityBlockingQueue :一个支持优先级排序的无界阻塞队列
- DelayQueue: 一个使用优先级队列实现的无界阻塞队列
- SynchronousQueue: 一个不存储元素的阻塞队列(常用)
- LinkedTransferQueue: 一个由链表结构组成的无界阻塞队列
- LinkedBlockingDeque: 一个由链表结构组成的双向阻塞队列
synchronized同步关键字的使用
- 同步代码块
- 同步方法
- 同步类
乐观锁和悲观锁的区别
乐观锁:每次被访问时都认为对方不会修改数据,所以不会给线程加锁 应用场景:查询时使用
悲观锁:每次被访问时都认为对方会修改数据,给线程上锁 应用场景:添加、修改、和删除时使用