最近项目中进行告警模块性能优化,不少地方使用了线程池技术,整理总结如下。

package com.coshaho.threadpool;import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;/*** 线程池学习* @author coshaho*/
public class MyThreadPool
{/*** 第一章  线程池初始化*/// 核心线程数量private int corePoolSize;// 最大线程数量private int maximumPoolSize;// 空闲线程存活时间private long keepAliveTime;// 空闲线程存活时间单位private TimeUnit unit;// 线程阻塞队列private BlockingQueue<Runnable> workQueue;/***  线程创建工厂,一般自定义,用于封装传入ThreadPool的Runnable任务*  默认:Executors.defaultThreadFactory()*  public interface ThreadFactory {  *      Thread newThread(Runnable r); *  }*/private ThreadFactory threadFactory;// 线程拒绝机制private RejectedExecutionHandler handler;public void initThreadPoolExecutor(){ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit,workQueue,threadFactory,handler);// 设置线程池核心线程数executor.setCorePoolSize(corePoolSize);// 设置线程池最大线程数executor.setMaximumPoolSize(maximumPoolSize);// 初始化一个核心线程executor.prestartCoreThread();// 初始化所有核心线程executor.prestartAllCoreThreads();// 不会立即终止线程池,而是要等所有任务缓存队列中的任务都执行完后才终止,但再也不会接受新的任务executor.shutdown();// 立即终止线程池,尝试打断正在执行的任务,并且清空任务缓存队列,返回尚未执行的任务executor.shutdownNow();}/*** 第二章  线程池任务处理机制* 来了一个任务后的处理机制* 1、 当线程池线程数量小于corePoolSize时,立即新建一个线程执行任务;* 2、 当线程池线程数量等于corePoolSize,workQueue不满时,任务入workQueue队列,等待调度;* 3、 当workQueue满,线程池线程数量小于maximumPoolSize时,新建线程执行任务;* 4、 当线程池线程数量等于maximumPoolSize,workQueue满时,采用线程拒绝机制处理任务。*//*** 第三章  线程阻塞队列* workQueue的类型为BlockingQueue<Runnable>,通常可以取下面三种类型:* 1、ArrayBlockingQueue:基于数组的先进先出队列,此队列创建时必须指定大小;* 2、LinkedBlockingQueue:基于链表的先进先出队列,如果创建时没有指定此队列大小,则默认为Integer.MAX_VALUE;* 3、synchronousQueue:这个队列比较特殊,它不会保存提交的任务,而是将直接新建一个线程来执行新来的任务。*//*** 第四章  线程拒绝机制*/public void rejectedExecutionHandlerLearn(){// 丢弃任务并抛出RejectedExecutionException异常handler = new ThreadPoolExecutor.AbortPolicy();// 也是丢弃任务,但是不抛出异常handler = new ThreadPoolExecutor.DiscardPolicy();// 丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)handler = new ThreadPoolExecutor.DiscardOldestPolicy();// 由调用线程处理该任务 handler = new ThreadPoolExecutor.CallerRunsPolicy();}/*** 第五章  JDK默认线程池*/public void jdkThreadPool(){//创建一个缓冲池,缓冲池容量大小为Integer.MAX_VALUEExecutors.newCachedThreadPool(); //创建容量为1的缓冲池Executors.newSingleThreadExecutor();//创建固定容量大小的缓冲池  Executors.newFixedThreadPool(5);    }/**public static ExecutorService newFixedThreadPool(int nThreads) {return new ThreadPoolExecutor(nThreads, nThreads,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());}public static ExecutorService newSingleThreadExecutor() {return new FinalizableDelegatedExecutorService(new ThreadPoolExecutor(1, 1,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>()));}public static ExecutorService newCachedThreadPool() {return new ThreadPoolExecutor(0, Integer.MAX_VALUE,60L, TimeUnit.SECONDS,new SynchronousQueue<Runnable>());}*//*** 第六章  线程池大小设置* 1、 如果是CPU密集型任务,就需要尽量压榨CPU,参考值可以设为 NCPU+1;* 2、 如果是IO密集型任务,参考值可以设置为2*NCPU。*//*** 第七章  JDK源码* Creates a new {@code ThreadPoolExecutor} with the given initial* parameters.** @param corePoolSize the number of threads to keep in the pool, even*        if they are idle, unless {@code allowCoreThreadTimeOut} is set* @param maximumPoolSize the maximum number of threads to allow in the*        pool* @param keepAliveTime when the number of threads is greater than*        the core, this is the maximum time that excess idle threads*        will wait for new tasks before terminating.* @param unit the time unit for the {@code keepAliveTime} argument* @param workQueue the queue to use for holding tasks before they are*        executed.  This queue will hold only the {@code Runnable}*        tasks submitted by the {@code execute} method.* @param threadFactory the factory to use when the executor*        creates a new thread* @param handler the handler to use when execution is blocked*        because the thread bounds and queue capacities are reached* @throws IllegalArgumentException if one of the following holds:<br>*         {@code corePoolSize < 0}<br>*         {@code keepAliveTime < 0}<br>*         {@code maximumPoolSize <= 0}<br>*         {@code maximumPoolSize < corePoolSize}* @throws NullPointerException if {@code workQueue}*         or {@code threadFactory} or {@code handler} is nullpublic ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler)*/
}

转载于:https://www.cnblogs.com/coshaho/p/5426887.html

Java线程池深入理解相关推荐

  1. Java并发编程与技术内幕:线程池深入理解

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要: 本文主要讲了Java当中的线程池的使用方法.注意事项及其实现源码实现原理,并辅以实例加 ...

  2. java线程池深入讲解_死磕 java线程系列之线程池深入解析——生命周期

    (手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本. 注:线程池源码部分如无特殊说明均指ThreadPoolExecutor类. 简介 上一章我们一起重温了下线程的 ...

  3. java任务流程_死磕 java线程系列之线程池深入解析——普通任务执行流程

    (手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本. 注:线程池源码部分如无特殊说明均指ThreadPoolExecutor类. 简介 前面我们一起学习了Java中 ...

  4. 死磕 java线程系列之线程池深入解析——未来任务执行流程

    (手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本. 注:线程池源码部分如无特殊说明均指ThreadPoolExecutor类. 简介 前面我们一起学习了线程池中普 ...

  5. 对Java线程概念的理解

    1.什么是线程 现代操作系统在运行一个程序时, 会为其创建一个进程. 例如, 启动一个Java程序, 操作系统就会创建一个Java进程. 现代操作系统调度的最小单元是线程, 也叫轻量级进程(Light ...

  6. 黑马程序员并发编程笔记(二)--java线程基本操作和理解

    3.java进程的基本操作 3.1.创建进程 方法一,直接使用 Thread // 构造方法的参数是给线程指定名字,,推荐给线程起个名字(用setName()也可以) Thread t1 = new ...

  7. Java线程深入的理解

    今天来讲解下java的线程机制.废话不多说,直接上代码吧.线程实现之Runable接口,我们选择该接口比较好,实现资源的共享 /*** @author hackbase Java多线程之Runable ...

  8. 【Java线程】深入理解Volatile关键字和使用

    目录 背景 volatile原理 volatile特性 可见性 有序性 原子性 使用场景 背景 理解volatile底层原理之前,首先介绍关于缓存一致性协议的知识. 背景:计算机在执行程序时,每条指令 ...

  9. java 线程池的理解_JAVA线程池原理的理解

    线程池原理基础理解: 线程池初始化规定个数的线程,然后这些线程一直运行,并且监控线程队列,只要线程队列被添加进线程,那么线程池不断从队列中取出线程运行.直到队列中的线程为空.实例代码如下: packa ...

最新文章

  1. 锁定计算机好在下游戏吗,巧用win7锁定计算机 防止孩子沉迷游戏
  2. java dalvik_深入理解Android之Java虚拟机Dalvik
  3. 聚类算法之DBScan(Java实现)[转]
  4. Fiori Elements - detail view layout analysis
  5. 网易资深Java架构师:jdkjrejvm的区别和联系
  6. 互联网晚报 | 12月6日 星期一 | 荣耀线下门店超3万家;鸿蒙系统明年正式登陆欧洲;凯撒旅业与众信旅游终止合并...
  7. 基于matlab的CIC滤波器仿真
  8. 软件测试流程五个阶段
  9. 【第十篇】单点登录原理和JWT实现
  10. 液压系统仿真软件_利用仿真软件判断系统稳定
  11. 八个常见CMD网络命令
  12. PX4 git submodule时:Failed to recurse into submodule path 'src/modules/uavcan/libuavcan
  13. 架构师日常-技术or业务
  14. 中小学计算机网络培训心得体会,计算机网络培训心得体会
  15. 电商小程序开发要多少钱?一文看懂电商小程序开发成本
  16. python计算标准差函数_Python pandas,pandas常用统计方法,求和sum,均值mean,最大值max,中位数median,标准差std...
  17. 辉太郎看前端(for...in和for...of)
  18. ubuntu占用空间清理
  19. OCJP(1Z0-851) 模拟题分析(四)
  20. Python —— 魔方方法

热门文章

  1. 从零开始学习OpenCL开发(一)架构
  2. 【转】各种媒体数据以 base64 编码方式直接嵌入网页中的写法
  3. web项目的两个创建形式website和webapplication
  4. sizeWithFont 不是线程安全。
  5. [20190214]11g Query Result Cache RC Latches.txt
  6. 『OpenCV3』滤波器实现及使用滤波器降噪
  7. FTP服务器搭建下的主动模式和被动模式
  8. 揭秘:美国警方监控技术大曝光
  9. C# Winform下载文件并显示进度条
  10. Debug javascript inside jsp page 调试jsp嵌入的js