高性能编程——多线程并发编程Java基础篇之线程池引用及实现原理剖析

为什么要用线程池

在学习线程池之前首先要明白为什么要用线程池,难倒创建线程他不香吗?

线程是不是越多越好?

答案肯定是否定的,因为如果是的话,就没必要创建线程池了,那么为什么线程不是越多越好呢?

  1. 线程在java中是一个对象,更是操作系统的资源,线程创建、销毁都需要时间。如果创建时间+销毁时间>执行任务时间 就很不合算。
  2. java对象占用堆内存,操作系统线程占用系统内存,根据jvm规范,一个线程默认最大栈大小1M,这个栈空间是需要从系统内存中分配的。线程过多,会消耗很多的内存。
  3. 操作系统需要频繁切换线程上下文(大家都想被运行),影响性能。

所以线程池的推出,就是为了方便的控制线程数量。

线程池原理 - 概念

  1. 线程池管理器:用于创建并管理线程池,包括创建线程池,销毁线程池,添加新任务;
  2. 工作线程:线程池中线程,在没有任务时处于等待状态,可以循环的执行任务;
  3. 任务接口:每个任务必须实现的接口,以供工作线程调度任务的执行,它主要规定了任务的入口,任务执行完后的收尾工作,任务的执行状态等;
  4. 任务队列:用于存放没有处理的任务。提供一种缓冲机制。

具体如下图:
在这里插入图片描述

线程池API中接口的定义和实现类

在这里插入图片描述

线程池API - Executors工具类

你可以自己实例化线程池,也可以用Executors创建线程池的工厂类,如下:

newFixedThreadPool(int nThreads)

创建一个固定大小、任务队列容量无界的线程池。核心线程数=最大线程数

newSingleThreadExecutor()

只有一个线程来执行无界任务队列的单一线程池。该线程池确保任务按加入的顺序一个一个依次执行。当唯一的线程因任务异常中止时,将创建一个新的线程来继续执行后续的任务,与上一个方法的区别在于,线程池的大小被硬编码在其中,不能改变

newScheduledThreadPool(int corePoolSize)

能定时执行任务的线程池。该池的核心线程数由参数指定,最大线程数 = Integer.MAX_VALUE;

发布了37 篇原创文章 · 获赞 10 · 访问量 720

猜你喜欢

转载自blog.csdn.net/weixin_41746577/article/details/103805257