`

线程池 浅析

阅读更多

本文是对java线程池的粗浅分析,视野局限于线程池的基本实现,不包含生命周期,状态管理。

 

线程池的特点是将任务的提交和执行分开。这样做的好处是,能使处理器尽量多地同时执行任务。

 

为此,线程池提供了两个角色:

任务 task

执行任务的工人 worker

 

与此相关,需要考虑:

工人的数量

工人数量的考量是线程池设计的一个关键。因此,这一点由构造线程池时,提供的头两个参数决定。

最小雇佣数量 corePoolSize

最多工人数量 maximumPoolSize

 

何时解雇多余 最小雇佣数量 的工人

工人多余任务时,它们会等待任务的到来,如果规定时间内,还没有任务,那我们就解雇多余的工人。

这个规定的时间就是构造子里的第三,第四个参数。

 

能接受的任务数量

一个工人,某一时间只能处理一个任务。工人的数量是有限的,因此多余工人数量的任务来了时:

线程池就要考虑是否接受

Y:

处于等待中的任务堆积到多少就不再允许接受任务

定等待 任务列表的容量[bound],达到容量后不再接受新任务。

无限制地接受等待任务[unbound]

设置何种任务等待列表由构造子的第五个参数决定。

 

N:

以何种方式拒绝:

由构造子的第七个参数决定。

 

第六个参数决定了

工人手里执行任务线程的工厂方法。

 

 

工作原理:

 

1.当工人数量没有达到最小雇佣数量时,每当任务来临,线程池都要创建一个工人,然后从线程工厂里创建一个新的线程,把任务作为该线程的target,把线程交给工人,把工人加入工人集合。该任务随即被执行。

 

2.如果任务来临时,当前工人数量poolSize已经大于最小雇佣数量,表明工人已经雇佣的差不多了,先让任务等待吧。

线程池尝试把任务加入任务列表,如果成功,任务提交的步骤就结束了。

 

2.5.任务列表是并发阻塞队列,工人会不断地尝试从队列里获取任务,如果获取到任务(请看5),工人就把任务拿去执行。这是任务的执行步骤。

 

3.如果加入队列失败,说明任务列表已经满了,不能再往里塞任务了。

这时,线程池判断工人数量是否达到最多工人数量。

如果还没有,则决定再雇佣一个工人(这和开始雇佣工人的步骤没有两样)。

 

4.如果已经达到雇佣上线,线程池没有办法了,只好拒绝该任务。

拒绝的方式有:

1、抛出异常给任务递送者,告诉他“老子累屁了,老子真的不干了”。 --这太粗暴了。线程池默认就这么干!

2、偷蔫儿地丢弃这个任务。 --这太猥琐了。

3、从任务列表里丢弃一个最近的任务,然后把这个任务放里。--这太势利眼了。

4、还给任务递送者,让他自己干。--这太无耻了。

 

5.线程池让工人等待任务的策略分两种(本文不考虑生命周期和状态):

死等!当工人数量少于或者等于最低雇佣数量时,它们没啥任务干了,就必须死等。

如果在给定时间内,没有任务来到,线程池开始数人头,如果不多于最低雇佣数量,这个工人还得重新等一个给定时间那么长。

 

6.否则,线程池把该工人的线程结束,告诉当前等待的工人,你没有任务了。不要再等了。

 

7.没有拿到任务的工人,被清除出工人集合--该工人正式下岗。

 

分享到:
评论

相关推荐

    Java线程池浅析1

    }关于FutureTask这个类的实现,我在前面的JAVA LOCK代码浅析有讲过其实现原理,主要的思想就是关注任务完成与未完成的状态,任务提交线程get()结

    Netty实现原理浅析.pdf

    ### Netty实现原理浅析 #### 一、总体结构概览 Netty是一个高性能的Java NIO框架,由JBoss出品。它不仅提供了一套完整的客户端和服务端开发工具集,而且具备高度可定制化的特点,使得开发者能够轻松构建出可靠且...

    java nio 原理浅析

    Netty提供了MemoryAwareThreadPoolExecutor和OrderedMemoryAwareThreadPoolExecutor两种线程池选项,前者限制待处理任务的数量,后者在保持事件顺序的同时处理任务。 2. **Buffer机制**: - **ChannelBuffer**:...

    浅析Java语言中线程的生命周期及实现方式.pdf

    浅析Java语言中线程的生命周期及实现方式 Java语言中的线程(Thread)是指在同一个进程中可以并发执行的多个控制流程。线程是Java语言中定义的非常重要的基本概念和技术标准。随着整个社会信息化的发展,传统服务器...

    Netty实现原理浅析.docx

    后者则通过线程池将处理器链的执行分离到多个线程,提高了并发性能。 Netty 默认采用的是多Reactor模型的一个变种,由Boss线程组负责接收新连接,然后分配给Worker线程组处理。Boss线程和NioWorker线程分别对应...

    ThreadLocal中内存泄漏和数据丢失问题的问题浅析及解决方案.docx

    2. 如果是线程池里的线程用 ThreadLocal 会有什么问题? ThreadLocal 的拓扑图: 虚线代表这弱引用,当前线程保存了 ThreadLocalMap 作为自己的 local 属性,而 Map 中的 key 又弱引用了 ThreadLocal,从而达到了...

    JAVA中的IOCP浅析.pdf

    JAVA中的IOCP浅析 同步和异步 在讨论IOCP之前,我们需要了解什么是同步和异步。通俗来说,完成一件事再去做另外一件事就是同步,而一起做两件或者两件以上的事情就是异步。例如,在客户端和服务器通信的过程中,...

    腾讯大讲堂数据库内核设计思路浅析学习教案.pptx

    - 数据库系统通常由多个组件构成,包括客户机、服务器核心、线程池、任务队列、系统日志、缓冲区、读/写线程等。 - 服务器核心负责处理来自客户端的TCP/IP连接,通过监听线程接收请求,并通过工作线程执行任务。 ...

    Netty实现原理浅析

    ### Netty实现原理浅析 #### 一、总体结构 Netty是一款由JBoss推出的高效且功能丰富的Java NIO框架,旨在简化网络编程并提高性能。为了更好地理解Netty的工作原理,我们首先需要了解它的整体架构。Netty的总体结构...

    浅析.Net下的多线程编程

    本文介绍了在.Net下进行多线程编程所...不过要编写出功能更加强大而且Bug少的多线程应用程序,大家需要掌握诸如线程同步、线程池等高级的多线程编程技术。大家不妨参考一些操作系统方面或是多线程编程方面的技术丛书。

    安卓Android源码——防止内存溢出浅析.zip

    本篇文章将深入浅析Android源码中的内存管理机制,以及如何预防和处理内存溢出问题。 首先,我们需要理解Android应用的内存结构。Android系统的内存分为堆(Heap)和栈(Stack)。栈主要存放方法的局部变量,而堆则...

    C#多线程参数传递浅析.pdf

    在上述代码中,`myParameter`通过`QueueUserWorkItem`方法加入线程池中的工作项,`instance.MyMethod2`方法随后在执行时会接收到这个参数。 文档还提到了异步委托的概念。异步委托允许委托在后台线程上调用一个方法...

    浅析java常用的设计模式.doc

    它常用于资源管理,如数据库连接池、线程池等。 6. **适配器模式**:适配器模式是一种结构型模式,它能使两个不兼容的接口协同工作。通过适配器,可以将一个类的接口转换成客户端期望的另一个接口。 7. **桥接模式...

    浅析Python多线程与多进程的使用

    Python是当今世界上最受欢迎的编程语言之一,特别是在处理数据科学、机器学习和Web开发等领域。...在实际开发中,我们还需要根据具体问题和需求,灵活运用线程池、进程池等高级工具,以达到最佳的性能效果。

    浅析分布式系统

    例如,使用线程池管理和控制并发任务的数量,以及采用异步处理模式,以减少等待时间。 低延迟是另一个重要指标,尤其在实时性要求高的应用中。为了降低延迟,分布式系统会采用缓存技术、预读取策略、并行计算等方式...

    浅析comet技术在java web实时系统开发中的应用.doc

    2. 并发处理:当大量用户同时使用时,需要设计合理的并发控制策略,如线程池管理,以处理高并发的连接请求。 3. 错误处理:考虑到网络环境的不稳定,需要处理断线重连、错误恢复等问题,确保服务的稳定性和可靠性。 ...

    浅析java常用的设计模式(doc-23页).doc

    它常用于管理共享资源,如数据库连接或线程池。 6. **适配器模式**:适配器模式允许两个不兼容的接口协同工作,它将一个类的接口转换为客户期望的另一个接口,使得原本由于接口不匹配而无法一起工作的类可以协同...

    Java互联网架构多线程并发编程原理及实战 视频教程 下载4.zip

    4-4 AbstractQueuedSynchronizer浅析.mp4 4-5 深入剖析ReentrantLock源码之非公平锁的实现.mp4 4-6 深入剖析ReentrantLock源码之公平锁的实现.mp4 4-7 掌控线程执行顺序之多线程debug.mp4 4-8 读写锁特性及...

Global site tag (gtag.js) - Google Analytics