java5之后为我们提供了线程池,只需要使用API,不用去考虑线程池里特殊的处理机制。
Java5的线程池分好多种:固定尺寸的线程池、可变尺寸连接池等。
常用的是ThreadPoolExecutor,它的继承关系如下:
下面详细说明一下自定义线程的使用:
TreadPoolExecutor的常用构造方法如下:
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler) { this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, Executors.defaultThreadFactory(), handler); }
下面是参数说明:
corePoolSize:线程池维护线程的最少数量,有可能是空闲的线程。
maximunPoolSize:线程池维护线程的最大数量。
keepAliveTime:线程池维护线程所允许的空闲时间。
TimeUnit:程池维护线程所允许的空闲时间的单位。
workQueue:线程池所使用的缓冲队列,改缓冲队列的长度决定了能够缓冲的最大数量。
RejectedExecutionHandler :拒绝任务的处理方式。
拒绝任务:是指当线程池里面的线程数量达到 maximumPoolSize 且 workQueue 队列已满的情况下被尝试添加进来的任务。
在 ThreadPoolExecutor 里面定义了 4 种 handler 策略,分别是
CallerRunsPolicy :这个策略重试添加当前的任务,他会自动重复调用 execute() 方法,直到成功。
AbortPolicy :对拒绝任务抛弃处理,并且抛出异常。
DiscardPolicy :对拒绝任务直接无声抛弃,没有异常信息。
DiscardOldestPolicy :对拒绝任务不抛弃,而是抛弃队列里面等待最久的一个线程,然后把拒绝任务加到队列。
一个任务通过 execute(Runnable) 方法被添加到线程池,任务就是一个 Runnable 类型的对象,任务的执行方法就是 Runnable 类型对象的 run() 方法。
当一个任务通过 execute(Runnable) 方法欲添加到线程池时,线程池采用的策略如下:
1. 如果此时线程池中的数量小于 corePoolSize ,即使线程池中的线程都处于空闲状态,也要创建新的线程 来处理被添加的任务。
2. 如果此时线程池中的数量等于 corePoolSize ,但是缓冲队列 workQueue 未满,那么任务被放入缓冲队列。
3. 如果此时线程池中的数量大于 corePoolSize ,缓冲队列 workQueue 满,并且线程池中的数量小于maximumPoolSize ,建新的线程来处理被添加的任务。
4. 如果此时线程池中的数量大于 corePoolSize ,缓冲队列 workQueue 满,并且线程池中的数量等于maximumPoolSize ,那么通过 handler 所指定的策略来处理此任务。
处理任务的优先级为:
核心线程 corePoolSize 、任务队列 workQueue 、最大线程 maximumPoolSize ,如果三者都满了,使用handler 处理被拒绝的任务。当线程池中的线程数量大于 corePoolSize 时,如果某线程空闲时间超过keepAliveTime ,线程将被终止。这样,线程池可以动态的调整池中的线程数。
我应用中的代码如下:
public class ThreadExecute{ private static Logger logger = LoggerFactory.getLogger(ThreadExecute.class); private final int corePoolSize = 2; // 线程池维护线程的最少数量 private final int maximumPoolSize = 4; // 线程池维护线程的最大数量 private final long keepAliveTime = 3; // 线程池维护线程所允许的空闲时间 private static int produceTaskMaxNumber = 4; public void processMessageTask() { // 创建等待队列 BlockingQueue<Runnable> bqueue = new ArrayBlockingQueue<Runnable>(20); // 构造一个线程池 ThreadPoolExecutor threadPool = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.SECONDS, bqueue, new ThreadPoolExecutor.CallerRunsPolicy()); for (int i = 1; i <= produceTaskMaxNumber; i++) { try { threadPool.execute(new MyThread()); } catch (Exception e) { logger.error("thread pool is error, content::" + e); } } } } class MyThread implements Runnable { public void run() { while(true){ try { Thread.sleep(2*1000); System.out.println(Thread.currentThread().getName() + "正在执行。。。"); } catch (InterruptedException e) { } } } }
相关推荐
本文将深入探讨Java线程池的源码分析,并对比不同类型的线程池,以帮助开发者更好地理解和利用这一强大的工具。 首先,我们要理解Java线程池的核心类`java.util.concurrent.ThreadPoolExecutor`,它是所有自定义...
java线程池源码 cThreadPool 项目描述:对java.util.concurrent包下线程池相关源码进行重新实现,深入研究和学习线程池超时机制、饱和策略、生命周期等知识 ThreadPoolExecutor类下部分方法和内部类介绍: 1、Worker...
线程池是Java多线程编程中不可或缺的一部分,它通过管理一组可重用线程来提高应用程序的性能和...通过分析这个源码,我们可以深入理解线程池的运作机制,并学习如何根据具体需求调整线程池参数,以实现高效的并发编程。
### 详解Java线程池的ctl(线程池控制状态) #### 0. 综述 在Java的并发编程中,`ThreadPoolExecutor`类扮演着非常重要的角色,它提供了创建和管理线程池的能力。线程池的核心在于如何有效地管理和调度线程资源,而...
本项目中分享的是一套经过实际项目验证的、性能稳定的线程池源码,包括ThreadPool.java、PooledThread.java和ThreadTask.java三个核心组件。 ThreadPool.java是线程池的核心类,它主要负责线程池的初始化、任务的...
3:对线程池的基本使用及其部分源码的分析(注意:这里的源码分析是基于jdk1.6;) a:线程池的状态 volatile int runState; static final int RUNNING = 0; 运行状态 static final int SHUTDOWN = 1; 关闭状态;...
同时,分析线程池源码能让我们更好地理解其内部机制,解决实际问题,例如处理拒绝策略、监控线程池状态等。 在`ThreadPoolExecutor`源码中,可以看到关键方法如`execute()`、`afterExecute()`、`beforeExecute()`...
通过分析Java线程池源码,我们可以学习到如何合理配置线程池参数,如何选择合适的工作队列,以及如何处理拒绝策略,从而在实际开发中更好地利用多线程来提高程序效率。此外,源码阅读也有助于理解Java并发库的设计...
3. 源码分析:如何在Java源码中查找线程池和消息队列的实现。 4. 文件路径管理:如何在Java中管理代码源路径,遍历目录结构。 5. 类和对象:`CodeReader`和`SourcePathManager`类的设计和实现。 为了深入理解这些...
源码分析** 阅读源码可以帮助我们更好地理解线程池的内部机制。例如,`ThreadPoolExecutor.execute()`方法是如何处理任务的提交,`ThreadPoolExecutor.shutdown()`和`shutdownNow()`又是如何优雅地关闭线程池。 **...
在Java编程领域,源码分析是一项至关重要的技能,它能帮助开发者深入理解框架的工作原理,提升软件设计和问题解决的能力。"Java源码分析 【源码笔记】"是一系列专门针对Java后端框架进行源码解析的文章集合,旨在...
java线程池源码解读 GRIDSS - 基因组重排识别软件套件 GRIDSS 是一个模块软件套件,包含用于检测基因组重排的工具。 GRIDSS 包括一个全基因组断裂端组装器,以及一个用于 Illumina 测序数据的结构变异调用器。 ...
### 线程池 `ThreadPoolExecutor` 原理源码分析 #### 一、概述 线程池作为 Java 并发编程中的重要组件,在实际应用中被广泛使用。其核心类 `ThreadPoolExecutor` 实现了对线程的管理、调度等功能。本文将围绕 `...
"java并发源码分析之实战编程"这个主题深入探讨了Java平台上的并发处理机制,旨在帮助开发者理解并有效地利用这些机制来提高程序性能和可扩展性。在这个专题中,我们将围绕Java并发库、线程管理、锁机制、并发容器...
在Java、C++等编程语言中,线程池被广泛应用,用于管理线程的生命周期,避免频繁创建和销毁线程带来的开销。本文将基于提供的"ThreadPool.cpp"和"ThreadPool.h"文件,深入解析线程池的实现原理及其自动管理线程创建...
在Java编程中,线程池是一种管理线程的机制,它可以帮助我们更有效地调度和执行并发任务。...结合`SurgeryThreadPool.java`源码分析和`Java.jpg`中的示例,我们可以进一步理解线程池在实际项目中的具体实现和应用。
`标签`中的“源码”提示我们可以深入研究Spring线程池的实现,例如分析`ThreadPoolTaskExecutor`的源代码,了解其内部如何处理任务提交、线程管理以及异常处理等。而“工具”则可能是指Spring提供的一些工具类或辅助...
通过上述对`ThreadPoolExecutor`线程池底层实现原理的解析,我们可以看到Java线程池的强大之处在于其高效的状态管理和任务调度机制。通过对`ctl`变量的巧妙利用,线程池能够有效地管理线程状态和数量,从而实现高...
Java源码分析是软件开发过程中一个重要的学习环节,它能帮助开发者深入理解代码背后的逻辑,提升编程技巧,以及优化程序性能。在这个过程中,我们通常会关注类的设计、算法的应用、数据结构的选择,以及如何利用Java...
本项目以"java多线程实现大批量数据导入源码"为题,旨在通过多线程策略将大量数据切分,并进行并行处理,以提高数据处理速度。 首先,我们需要理解Java中的线程机制。Java通过`Thread`类来创建和管理线程。每个线程...