线程池.txt 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. 线程池
  2. 线程池可以理解为是一个池子,里面存储多个线程。
  3. 线程池在启动的时候,会创建大量的空闲线程,当我们向线程池提交任务的时候
  4. 线程池就会启动一个线程来处理任务。等任务处理完毕后,线程不会死亡,
  5. 而是再次返回到线程池中,成为空闲状态,等待执行下一次任务。
  6. 线程池设计思路:
  7. 1、准备一个任务容器
  8. 2、一次性启动多个消费者线程
  9. 3、刚开始任务容器是空的,所以所有消费者线程都是wait()等待状态
  10. 4、直到一个外部线程(生产者)向这个任务容器扔了一个任务,就会有一个消费者线程被唤醒。
  11. 5、这个消费者线程取出任务,并且执行这个任务,执行完毕后,会再次进入等待状态,继续等待下一个任务。
  12. Java为我们提供了很多的线程池:
  13. ExecutorService newCachedThreadPool();方法创建一个默认的线程池
  14. ExecutorService newFixedThreadPool(int nThreads) 创建一个线程池,指定核心线程数和最大线程数
  15. 刚开始创建线程池的时候,并不会自动的创建线程放进线程池,直到有任务需要线程执行,才会创建线程来执行任务。
  16. ThreadPoolExecutor 这个线程池对象我们用的更多一些
  17. ThreadPoolExecutor pool=new ThreadPoolExecutor(核心线程数,最大线程数,空闲线程最大存活时间,时间单位,任务队列,线程工厂,任务拒绝策略)
  18. 1、核心线程数 -->不能小于0
  19. 2、最大线程数 -->不能小于等于0,最大线程数必须大于或等于核心线程数
  20. 3、空闲线程最大存活时间 -->不能小于0
  21. 4、时间单位 -->时间单位
  22. 5、任务队列 -->不能为null
  23. 6、线程工厂 -->不能为null
  24. 7、任务拒绝策略 -->不能为null
  25. 线程池的任务拒绝策略:
  26. 1、ThreadPoolExecutor.AbortPolicy类 默认的拒绝策略,丢掉任务,并且抛出RejectedExecutionException异常
  27. 2、ThreadPoolExecutor.DiscardPolicy类 丢弃任务,但是不抛出任何异常, 不建议使用。
  28. 3、ThreadPoolExecutor.DiscardOldestPolicy 丢弃队列中等待最久的任务,然后把当前的任务加入到队列。
  29. 4、ThreadPoolExecutor.CallerRunsPolicy 调用任务的run()方法,绕过线程池直接运行。
  30. ThreadPoolExecutor pool = new ThreadPoolExecutor(
  31. 2,
  32. 5,
  33. 20,
  34. TimeUnit.MICROSECONDS,
  35. new ArrayBlockingQueue<>(10),
  36. Executors.defaultThreadFactory(),
  37. new ThreadPoolExecutor.DiscardPolicy()); //设置拒绝策略
  38. 线程池最多可以执行的任务数=任务队列的容量+最大线程数