并发学习(三)阻塞队列/线程池/死锁

  •  线程池

3种常用的线程池:

  1. newSIngleThreadExecutor(创建一个单线程)
  2. newFixedThreadPool(创建固定大小的线程池)
  3. newCacheThreadPool(创建一个可缓存的线程池)如果线程池的大小超过了处理任务所需的线程,那么就会回收部分空闲(60s不执行任务)的线程,当任务数增加时,此线程又可以添加新的线程来处理任务。

创建线程:使用Executors类提供的几个静态方法来创建线程池。

构造器的各个核心参数的含义:

  corePoolsize:核心池大小

  maxPoolSize:线程池最大线程数

关闭线程:

  shutdown()和shutdownNow()是用来关闭线程的

  • 阻塞队列:

  对一个队列满了之后进行如队列(阻塞)

  对一个队列空了之后进行出队列(阻塞)

  用于消费者(取队列中元素的线程)生成者(往队列中添加元素的线程)

  1. ArrayblockingQueue:有界,锁是没有分离的,即生产者和消费者是同一把锁;进行put和take操作,公用同一个锁对象。也就是说put和take无法并行执行
  2. DelayQueue:按元素过期时间进行排序(DelayQueue=BlockingQueue+PriorityQueue+Delayed)
  3. LinkedBlockingQueue:对于生产者端和消费者端分别采用了独立的锁来控制数据同步,这也意味着在高并发的情况下生产者和消费者可以并行地操作队列中的数据,一次来提高整个队列的并发性能。
  4. PriorityBlockingQueue:无界,可以插入空对象(插入对象必须实现Comparable接口)
  5. SynchronousQueue:无界无缓存,不存储元素,它的size()方法总是返回0。每个线程插入操作必须等待另一个线程的插入操作。
  •  死锁:

  互斥条件(Mutual exclusion):资源不能被共享,只能由一个进程使用。
  请求与保持条件(Hold and wait):已经得到资源的进程可以再次申请新的资源。
  非剥夺条件(No pre-emption):已经分配的资源不能从相应的进程中被强制地剥夺。
  循环等待条件(Circular wait):系统中若干进程组成环路,该环路中每个进程都在等待相邻进程正占用的资源。

原文地址:https://www.cnblogs.com/nickup/p/9715344.html