线程池为线程生命周期开销问题和资源不足问题提供了解决方案。通过对多个任务重用线程,线程创建的开销被分摊到了多个任务上。其好处是,因为在请求到达时线程已经存在,所以无意中也消除了线程创建所带来的延迟。这样,就可以立即为请求服务,使应用程序响应更快。而且,通过适当地调整线程池中的线程数目,也就是当请求的数目超过某个阈值时,就强制其它任何新到的请求一直等待,直到获得一个线程来处理为止,从而可以防止资源不足。

具体的线程池详细见解 如: http://www.importnew.com/19011.html

使用spring管理线程池的使用

1、创建线程池的配置信息threads.properties

####业务线程池配置####
#是否启用自定义线程池。true时启动,以下参数生效
handler.threads.custom=false
#核心线程数
handler.threads.corePoolSize=20
#最大线程数
handler.threads.maximumPoolSize=1000
#空闲线程存活时间,单位秒
handler.threads.keepAliveTime=100
#工作队列大小,为0是无限大
handler.threads.workQueue=0

2、创建 线程池 配置,ThreadsPoolConfig.java

package com.hk.core.concurrent;import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;/*** 线程池 配置*/
@Component
public class ThreadsPoolConfig {/*** 是否开启自定义线程池*/@Value("${handler.threads.custom}")private boolean custom;/*** 核心线程数*/@Value("${handler.threads.corePoolSize}")private int corePoolSize;/*** 线程池最大线程数*/@Value("${handler.threads.maximumPoolSize}")private int maximumPoolSize;/*** 空闲线程存活时间(对核心线程无效)*/@Value("${handler.threads.keepAliveTime}")private long keepAliveTime;/*** 任务队列大小,0时为无界队列*/@Value("${handler.threads.workQueue}")private int workQueue;public boolean isCustom() {return custom;}public void setCustom(boolean custom) {this.custom = custom;}public int getCorePoolSize() {return corePoolSize;}public void setCorePoolSize(int corePoolSize) {this.corePoolSize = corePoolSize;}public int getMaximumPoolSize() {return maximumPoolSize;}public void setMaximumPoolSize(int maximumPoolSize) {this.maximumPoolSize = maximumPoolSize;}public long getKeepAliveTime() {return keepAliveTime;}public void setKeepAliveTime(long keepAliveTime) {this.keepAliveTime = keepAliveTime;}public int getWorkQueue() {return workQueue;}public void setWorkQueue(int workQueue) {this.workQueue = workQueue;}}

3、创建 线程池 处理器管理线程 HandlerThreadsPool.java

package com.hk.core.concurrent;import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;import javax.annotation.PreDestroy;/*** 线程管理器*/
public class HandlerThreadsPool {public ExecutorService executorService;public HandlerThreadsPool() {// TODO Auto-generated constructor stubthis.executorService=Executors.newCachedThreadPool();}public HandlerThreadsPool(ThreadsPoolConfig config) {// TODO Auto-generated constructor stubif(config.isCustom()){BlockingQueue<Runnable> queue=null;if(config.getWorkQueue()>0){queue=new LinkedBlockingQueue<Runnable>(config.getWorkQueue()); // 一般使用 LinkedBlockingQueue 队列}else{queue=new LinkedBlockingQueue<Runnable>();}        // 配置线程池信息this.executorService=new ThreadPoolExecutor(config.getCorePoolSize(), config.getMaximumPoolSize(), config.getKeepAliveTime(), TimeUnit.SECONDS, queue, new ThreadPoolExecutor.AbortPolicy()//拒绝策略,任务队列满后,新的任务将被丢弃,并抛出异常
                    );}else{this.executorService=Executors.newCachedThreadPool();}}

 /*   * 创建线程,对线程处理事件     */public void execute(Runnable runnable){executorService.execute(runnable);} /*   * 对象销毁时,销毁线程   */@PreDestroypublic void stop() {executorService.shutdown(); }}

4、使用线程池

package com.hk.core.concurrent;import javax.annotation.PostConstruct;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class MsgHandler implements Runnable{@Autowiredprivate  ThreadsPoolConfig config;  // 注入 配置
    @Overridepublic void run() {// do 这里 写 处理的逻辑System.out.println("创建线程 处理事务....");}@PostConstructpublic void loadThreadsPool(){// 初始化 线程池HandlerThreadsPool handlerThreadsPool=new HandlerThreadsPool(config); //调用线程池,创建线程  。处理事件handlerThreadsPool.execute(new MsgHandler());}
}

简单的例子就这样完美使用线程池了

转载于:https://www.cnblogs.com/lemon-flm/p/7879014.html

Java队列——线程池创建的例子相关推荐

  1. java 队列线程池_Java线程池Executor使用

    原标题:Java线程池Executor使用 合理利用线程池能够带来三个好处.第一:降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗.第二:减少系统对于,外部 服务的响应时间的等待.第 ...

  2. java 队列线程池_JAVA工作队列与线程池

    为什么要使用线程池? 诸如 Web 服务器.数据库服务器.文件服务器或邮件服务器之类的许多服务器应用程序都面向处理来自某些远程来源的大量短小的任务.请求以某种方式到达服务器,这种方式可能是通过网络协议 ...

  3. 【Java 并发编程】线程池机制 ( 线程池阻塞队列 | 线程池拒绝策略 | 使用 ThreadPoolExecutor 自定义线程池参数 )

    文章目录 一.线程池阻塞队列 二.拒绝策略 三.使用 ThreadPoolExecutor 自定义线程池参数 一.线程池阻塞队列 线程池阻塞队列是线程池创建的第 555 个参数 : BlockingQ ...

  4. 谈谈java的线程池(创建、机制)

    目录 Executors创建线程池默认方法 自定义线程池 Executors创建线程池默认方法 newFixedThreadPool()方法,该方法返回一个固定数量的线程池,该方法的线程数始终不变,当 ...

  5. 探索JAVA并发 - 线程池详解

    作者:acupt,80后资深Java工程师一枚!架构师社区合伙人! 线程池是并发编程中必不可少的一种工具,也是面试高频话题. 线程池,即管理着若干线程的资源池(字面意思).相比于为每个任务分配一个线程 ...

  6. Java并发—线程池ThreadPoolExecutor基本总结

    原文作者:Matrix海子 原文地址:Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线 ...

  7. Java中线程池,你真的会用吗

    转载自   Java中线程池,你真的会用吗 在<深入源码分析Java线程池的实现原理>这篇文章中,我们介绍过了Java中线程池的常见用法以及基本原理. 在文中有这样一段描述: 可以通过Ex ...

  8. java中线程池的几种实现方式

    1.线程池简介:     多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力.         假设一个服务器完成一项任务所需时间为:T1 ...

  9. Java中线程池,你真的会用吗?

    在<深入源码分析Java线程池的实现原理>这篇文章中,我们介绍过了Java中线程池的常见用法以及基本原理. 在文中有这样一段描述: 可以通过Executors静态工厂构建线程池,但一般不建 ...

最新文章

  1. 把巧克力球送上天,玛氏用Uni Marketing 打造网红零食
  2. 【Android 逆向】整体加固脱壳 ( DEX 优化流程分析 | DexPrepare.cpp 中 dvmContinueOptimizati() 函数分析 )
  3. 老李推荐: 第8章4节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-启动AndroidDebugBridge 1...
  4. 文巾解题 344 反转字符串
  5. 求取给定的二叉树的镜像_17---二叉树的镜像
  6. 线程池是如何执行的?拒绝策略有哪些?
  7. asp还有人用吗_中药都安全吗?服用这些中药需要注意
  8. 计算机病毒与恶意代码期末总结
  9. Paypal与Moneybookers的比较
  10. 运算(与运算)和|运算(或运算)
  11. Python转盘游戏
  12. 乒乓操作的写入控制器
  13. MDK5 Kil5中STM32工程的建立过程
  14. GitHub登录流程
  15. 基于知识图谱的人机对话系统 | 公开课笔记
  16. Google Earth Engine(GEE)扩展——gena包文本注释脚本
  17. 新垣结衣自拍照_如何拍好自画像和自拍照
  18. 2D游戏地图编辑器的制作(一)
  19. oracle的存储过程写法Oracle中如何写存储过程
  20. Adobe Audition 2020 入门教程(一)导入素材

热门文章

  1. python-可变循环
  2. 自定义UITableViewCell
  3. eclipse 统计代码行数
  4. 关于armhf (hard-float ABI for ARM)
  5. word不能插入压缩包等文件的解决办法
  6. 护士如何预防职业病:下肢静脉曲张-健康小常识
  7. Oracle 9i for RedHat Linux 的安装
  8. java 高性能代码_[Java教程]Javascript高性能代码(一)
  9. 蓝桥杯 ALGO-69 算法训练 字符串逆序
  10. LeetCode 90. Subsets II