`
benx
  • 浏览: 276185 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

谈线程池

    博客分类:
  • java
 
阅读更多

线程池原理:用指定数量的线程,执行大量的线程任务

 

线程池作用:

假设目前有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 是先关闭线程池中非当前工作线程,停止接收新的任务,等任务执行完后关闭。

分享到:
评论

相关推荐

    浅谈线程池.pdf

    本文主要探讨了Java中的线程池,包括为何要使用线程池、线程池的原理、如何优化线程池参数以及线程池与Go语言中的协程(goroutine)的对比。 ### 为什么使用线程池 1. **系统资源消耗**:线程是操作系统中的基本...

    安卓,线程池的使用 ,封装

    在Android中,通常推荐使用`Executors`静态工厂方法来创建线程池,如`newFixedThreadPool`用于创建固定大小的线程池,`newCachedThreadPool`用于创建缓存线程池等。然而,直接使用这些预定义的线程池可能无法满足...

    Android开发经验谈:并发编程(线程与线程池)(推荐)

    Android开发经验谈:并发编程(线程与线程池) Android开发中,线程和线程池是两个非常重要的概念。线程是Android开发中的一种基本单位,它可以帮助我们实现并发编程,提高应用程序的性能和响应速度。然而,线程也...

    浅谈python 线程池threadpool之实现

    ### 浅谈Python线程池ThreadPool之实现 在并发编程领域,线程池技术是一种非常高效的方法,可以显著提升程序的执行效率。Python中的`threadpool`库为开发者提供了便捷的方式来管理和利用线程池。本文将详细介绍...

    浅谈Spring @Async异步线程池用法总结

    浅谈Spring @Async异步线程池用法总结 本文主要介绍了Spring @Async异步线程池的用法总结,包括异步线程池的接口类、@Async定义异步任务、Spring开启异步配置等内容。 1. 异步线程池的接口类 Spring提供了多种...

    浅谈java常用的几种线程池比较

    Java线程池是一种高效管理线程的工具,它允许开发者预先配置一定数量的线程,以处理并发任务,而不是每次需要处理任务时才创建新线程。线程池的使用可以减少线程创建和销毁的开销,提高系统资源利用率,并能够通过...

    浅谈Android 的线程和线程池的使用

    在Android开发中,线程和线程池的管理对于应用性能和用户体验至关重要。本文将深入探讨Android中的线程和线程池的使用,包括主线程、子线程、AsyncTask、HandlerThread以及IntentService。 首先,主线程在Android中...

    浅谈Android中线程池的管理

    在Android开发中,线程池的管理是一项重要的任务,尤其是在处理异步任务和优化性能时。本文将深入探讨Android中的线程池管理,以及与之相关的线程机制,如Handler、Looper和MessageQueue。 首先,我们来了解下...

    浅谈java.util.concurrent包中的线程池和消息队列

    "java.util.concurrent包中的线程池和消息队列" java.util.concurrent包中的线程池和消息队列是一种高效的多线程编程技术,主要用于解决处理器单元内多个线程执行的问题。线程池技术可以显著减少处理器单元的闲置...

    C#面向对象设计模式纵横谈-1.Singleton 单件(创建型模式)

    这种模式在需要控制资源的唯一性或者全局访问点时非常有用,比如数据库连接、线程池或者缓存管理等。 Singleton模式的核心在于限制类的实例化过程,通常通过私有构造函数和静态工厂方法来实现。以下是一个简单的C# ...

    谈一谈网络编程学习经验.rar_网络学习的经验

    下面,我们将结合标题“谈一谈网络编程学习经验”以及描述中的数字串(可能是随机输入或者错误),探讨网络编程学习的一些关键知识点。 首先,基础理论是学习网络编程的基石。你需要理解网络的基本概念,如OSI七层...

    浅谈linux多线程编程和windows多线程编程的异同.doc

    在 Windows 中,线程间通信还有其他高级特性,如线程同步对象(事件、信号量、临界区等),以及线程池等。线程池允许预先创建一组线程,待有任务时分配给它们执行,提高了效率。而在 Linux 中,虽然没有内置的线程池...

    Python性能优化经验谈.zip

    - `concurrent.futures`模块:提供线程池和进程池,方便地进行异步任务调度。 7. **C扩展与Cython** - 使用C语言编写Python扩展模块,可以显著提高性能,但开发难度增加。 - Cython是一种静态类型的Python方言,...

    谈一谈对JUC的理解Java系列2021.pdf

    JUC包包含了一系列的并发工具类,如线程池(ExecutorService)、并发集合(ConcurrentHashMap、CopyOnWriteArrayList等)、同步器(Semaphore、CountDownLatch、CyclicBarrier)以及原子类(AtomicInteger、...

    浅谈tomcat一些细节配置

    【标题】:“浅谈Tomcat一些细节配置” Tomcat,作为Apache软件基金会的开源项目,是Java Servlet和JavaServer Pages(JSP)的容器,也是Java EE Web应用程序的标准实现。在实际开发和部署中,对Tomcat进行适当的...

Global site tag (gtag.js) - Google Analytics