线程池原理:用指定数量的线程,执行大量的线程任务
线程池作用:
假设目前有1000个任务需要执行,电脑的CPU核心为4,没有其他任务使用CPU。
那么有如下方式可以执行上述任务:
1、使用单个线程线性的执行1000个任务
缺点:不能最大程度的使用CPU,将会有3个CPU核心空闲,而且如果任务涉及IO读写等原因导致CPU中断,那么效率将极其低下。
2、每个任务过来,开启一个线程
缺点:如果每个任务的执行时间非常非常短,那么可以使用这种模式,如果每个任务执行非常长,最差的情况就是1000个线程共用4个CPU核心,这样导致非常频繁的上下文切换,每次切换涉及当前线程的CPU寄存器,虚拟内存的保存,然后唤醒另外一个线程,恢复该线程的上下文。
3、开启4个线程,每个线程监视任务,如果任务过来,将使用该线程执行任务,然后继续监视任务。
优点:合理的利用CPU,发挥最大性能
对于线程池具体需要开启多少个线程合理,个人认为需要考虑如下几点:
1、程序运行的环境,主要是看CPU参数
2、线程将要执行的任务情况:是属于计算型,还是IO读写,网络传输型
3、当前程序开启的线程情况。
ThreadPoolExecutor 简单解读:
ThreadPoolExecutor是个线程池的实现,有如下几个参数:
1、BlockingQueue<Runnable> workQueue 任务集合,如果workQueue指定了容量大小为N,那么当workQueue 的当前大小等于N时,每次任务过来将会开启一个工作线程,如果开启的工作线程大于maximumPoolSize,那么会调用reject方法,默认是忽略该任务,用户可以指定任何处理。
2、HashSet<Worker> workers 当前的工作线程
3、volatile long keepAliveTime 当大于corePoolSize的线程空闲该时间,将销毁
4、volatile int corePoolSize 工作线程的核心数量,任务过来,如果poolSize<corePoolSize那么将会新建一个工作线程,核心线程不会被销毁
5、volatile int maximumPoolSize 工作线程的最大数量
6、volatile int poolSize 当前工作线程数量
7、volatile RejectedExecutionHandler handler 当任务被拒绝时调用的处理器
注意点:
新建工作线程的条件:
1、当前工作线程小于corePoolSize时
2、当workQueue满了且当前工作线程小于maximumPoolSize的时候
何时任务被拒绝:
1、workQueue满了,并且poolSize == maximumPoolSize
shutdownNow 和 shutdown 区别:
shutdownNow 是立即关闭当前所有线程,然后返回没有执行完的工作任务
shutdown 是先关闭线程池中非当前工作线程,停止接收新的任务,等任务执行完后关闭。
分享到:
相关推荐
本文主要探讨了Java中的线程池,包括为何要使用线程池、线程池的原理、如何优化线程池参数以及线程池与Go语言中的协程(goroutine)的对比。 ### 为什么使用线程池 1. **系统资源消耗**:线程是操作系统中的基本...
在Android中,通常推荐使用`Executors`静态工厂方法来创建线程池,如`newFixedThreadPool`用于创建固定大小的线程池,`newCachedThreadPool`用于创建缓存线程池等。然而,直接使用这些预定义的线程池可能无法满足...
Android开发经验谈:并发编程(线程与线程池) Android开发中,线程和线程池是两个非常重要的概念。线程是Android开发中的一种基本单位,它可以帮助我们实现并发编程,提高应用程序的性能和响应速度。然而,线程也...
### 浅谈Python线程池ThreadPool之实现 在并发编程领域,线程池技术是一种非常高效的方法,可以显著提升程序的执行效率。Python中的`threadpool`库为开发者提供了便捷的方式来管理和利用线程池。本文将详细介绍...
浅谈Spring @Async异步线程池用法总结 本文主要介绍了Spring @Async异步线程池的用法总结,包括异步线程池的接口类、@Async定义异步任务、Spring开启异步配置等内容。 1. 异步线程池的接口类 Spring提供了多种...
Java线程池是一种高效管理线程的工具,它允许开发者预先配置一定数量的线程,以处理并发任务,而不是每次需要处理任务时才创建新线程。线程池的使用可以减少线程创建和销毁的开销,提高系统资源利用率,并能够通过...
在Android开发中,线程和线程池的管理对于应用性能和用户体验至关重要。本文将深入探讨Android中的线程和线程池的使用,包括主线程、子线程、AsyncTask、HandlerThread以及IntentService。 首先,主线程在Android中...
在Android开发中,线程池的管理是一项重要的任务,尤其是在处理异步任务和优化性能时。本文将深入探讨Android中的线程池管理,以及与之相关的线程机制,如Handler、Looper和MessageQueue。 首先,我们来了解下...
"java.util.concurrent包中的线程池和消息队列" java.util.concurrent包中的线程池和消息队列是一种高效的多线程编程技术,主要用于解决处理器单元内多个线程执行的问题。线程池技术可以显著减少处理器单元的闲置...
这种模式在需要控制资源的唯一性或者全局访问点时非常有用,比如数据库连接、线程池或者缓存管理等。 Singleton模式的核心在于限制类的实例化过程,通常通过私有构造函数和静态工厂方法来实现。以下是一个简单的C# ...
下面,我们将结合标题“谈一谈网络编程学习经验”以及描述中的数字串(可能是随机输入或者错误),探讨网络编程学习的一些关键知识点。 首先,基础理论是学习网络编程的基石。你需要理解网络的基本概念,如OSI七层...
在 Windows 中,线程间通信还有其他高级特性,如线程同步对象(事件、信号量、临界区等),以及线程池等。线程池允许预先创建一组线程,待有任务时分配给它们执行,提高了效率。而在 Linux 中,虽然没有内置的线程池...
- `concurrent.futures`模块:提供线程池和进程池,方便地进行异步任务调度。 7. **C扩展与Cython** - 使用C语言编写Python扩展模块,可以显著提高性能,但开发难度增加。 - Cython是一种静态类型的Python方言,...
JUC包包含了一系列的并发工具类,如线程池(ExecutorService)、并发集合(ConcurrentHashMap、CopyOnWriteArrayList等)、同步器(Semaphore、CountDownLatch、CyclicBarrier)以及原子类(AtomicInteger、...
【标题】:“浅谈Tomcat一些细节配置” Tomcat,作为Apache软件基金会的开源项目,是Java Servlet和JavaServer Pages(JSP)的容器,也是Java EE Web应用程序的标准实现。在实际开发和部署中,对Tomcat进行适当的...