创建线程的三种方式

  1. 实现runable接口,重写run方法
  2. 继承Thread类,重写run方法
  3. 实现Callable接口,重写call方法

四种线程池的创建和使用场景

线程池的作用:实现线程复用

线程池的流程图

image.jpeg

  1. newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
  2. newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
  3. newScheduledThreadPool 创建一个可定期或者延时执行任务的定长线程池,支持定时及周期性任务执行。
  4. newCachedThreadPool 创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。

    线程的配置

    四种线程池本质都是创建ThreadPoolExecutor类,ThreadPoolExecutor构造参数如下

  5. int corePoolSize, 核心线程大小

  6. int maximumPoolSize,最大线程大小
  7. long keepAliveTime, 超过corePoolSize的线程多久不活动被销毁时间
  8. TimeUnit unit,时间单位
  9. BlockingQueue workQueue 任务队列
  10. ThreadFactory threadFactory 线程池工厂
  11. RejectedExecutionHandler handler 拒绝策略

    阻塞队列

  12. ArrayBlockingQueue :一个由数组结构组成的有界阻塞队列

  13. LinkedBlockingQueue :一个由链表结构组成的有界阻塞队列(常用)
  14. PriorityBlockingQueue :一个支持优先级排序的无界阻塞队列
  15. DelayQueue: 一个使用优先级队列实现的无界阻塞队列
  16. SynchronousQueue: 一个不存储元素的阻塞队列(常用)
  17. LinkedTransferQueue: 一个由链表结构组成的无界阻塞队列
  18. LinkedBlockingDeque: 一个由链表结构组成的双向阻塞队列

    synchronized同步关键字的使用

    1. 同步代码块
    2. 同步方法
    3. 同步类

乐观锁和悲观锁的区别

乐观锁:每次被访问时都认为对方不会修改数据,所以不会给线程加锁 应用场景:查询时使用

悲观锁:每次被访问时都认为对方会修改数据,给线程上锁 应用场景:添加、修改、和删除时使用