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

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

使用spring管理线程池的使用

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

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

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 stub
this.executorService=Executors.newCachedThreadPool();
} public HandlerThreadsPool(ThreadsPoolConfig config) {
// TODO Auto-generated constructor stub
if(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);
} /*
   * 对象销毁时,销毁线程
   */
@PreDestroy
public 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{ @Autowired
private ThreadsPoolConfig config; // 注入 配置 @Override
public void run() {
// do 这里 写 处理的逻辑
System.out.println("创建线程 处理事务....");
} @PostConstruct
public void loadThreadsPool(){ // 初始化 线程池
HandlerThreadsPool handlerThreadsPool=new HandlerThreadsPool(config); //调用线程池,创建线程 。处理事件
handlerThreadsPool.execute(new MsgHandler());
}
}

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

Java队列——线程池创建的例子的更多相关文章

  1. java中线程池创建的几种方式

    java中创建线程池的方式一般有两种: 通过Executors工厂方法创建 通过new ThreadPoolExecutor(int corePoolSize, int maximumPoolSize ...

  2. Java 中线程池的 7 种创建方式!

    在 Java 语言中,并发编程都是通过创建线程池来实现的,而线程池的创建方式也有很多种,每种线程池的创建方式都对应了不同的使用场景,总体来说线程池的创建可以分为以下两类: 通过 ThreadPoolE ...

  3. 深入理解Java之线程池

    原作者:海子 出处:http://www.cnblogs.com/dolphin0520/ 本文归作者海子和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则 ...

  4. Java中线程池的学习

    线程池的基本思想还是一种对象池的思想,开辟一块内存空间,里面存放了众多(未死亡)的线程,池中线程执行调度由池管理器来处理.当有线程任务时,从池中取一个,执行完成后线程对象归池,这样可以避免反复创建线程 ...

  5. 深入理解Java之线程池(爱奇艺面试)

    爱奇艺的面试官问 (1) 线程池是如何关闭的 (2) 如何确定线程池的数量 一.线程池销毁,停止线程池 ThreadPoolExecutor提供了两个方法,用于线程池的关闭,分别是shutdown() ...

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

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

  7. [转]深入理解Java之线程池

    原文链接 原文出处: 海 子 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这 ...

  8. 沉淀再出发:java中线程池解析

    沉淀再出发:java中线程池解析 一.前言 在多线程执行的环境之中,如果线程执行的时间短但是启动的线程又非常多,线程运转的时间基本上浪费在了创建和销毁上面,因此有没有一种方式能够让一个线程执行完自己的 ...

  9. Java之线程池

    假设一个服务器完成一项任务所需时间为:T1 创建线程时间,T2 在线程中执行任务的时间,T3 销毁线程时间.当T1 + T3 远大于 T2时,采用多线程技术可以显著减少处理器单元的闲置时间,增加处理器 ...

随机推荐

  1. 判断页面是app打开还是浏览器打开。cookie

    有个需求需要对页面判断不同的打开方式来最里面的链接进行不同调整, 这样就要分四种情况,app,浏览器X安卓系统,苹果系统,起初是对页面url地址带有的参数(安卓)跟用户代理(苹果)返回值判断navig ...

  2. Linux 下socket通信终极指南(附TCP、UDP完整代码)

    linux下用socket通信,有TCP.UDP两种协议,网上的很多教程把两个混在了一起,或者只讲其中一种.现在我把自己这两天研究的成果汇总下来,写了一个完整的,适合初学者参考,也方便自己以后查阅. ...

  3. 20155326 《Java程序设计》实验五网络编程与安全实验报告

    20155326 <Java程序设计>实验五网络编程与安全实验报告 实验内容 任务一 1.两人一组结对编程: 参考http://www.cnblogs.com/rocedu/p/67667 ...

  4. Python3 安装 PyQt5 -pycharm 环境搭建

    执行命令: pip3 install PyQt5 PyQt5+python3+pycharm开发环境配置   1.下载PyQt 官方网站:http://www.riverbankcomputing.c ...

  5. LogisticRegression in MLLib

    例子 iris数据训练Logistic模型.特征petal width和petal height,分类目标有三类. import org.apache.spark.mllib.classificati ...

  6. jacoco初探

    # 背景 集团的代码覆盖率平台因为网络问题无法使用,只能自己研究下. 覆盖率是衡量自动化用例效果产品的一个指标,但只是一个辅助指标,覆盖率高并不意味着质量好,但覆盖率低却能说明一些问题, # 对比 覆 ...

  7. 【转】dlgdata.cpp line 40 断言失败

    原文网址:http://blog.csdn.net/onlyou930/article/details/6384075 在VS2010 运行一个C++ 程序,出现下图错误: 一看到这个,我头都大了.关 ...

  8. 解决网页出现 net::ERR_ABORTED 404 (Not Found)问题

    1.在web.config配置文件中添加woff字体的MIME类型 在Web.config中的system.webServer节点添加 <staticContent> <remove ...

  9. C#爬取京东手机数据+PowerBI数据可视化展示

    此系列博文链接 C#爬虫基本知识 Html Agility Pack解析html TODO: EF6中基本认识. EF6操作mysql MySQL乱码问题 C#爬虫 在开头贴一下github仓库地址, ...

  10. this与$(this)对象

    this与$(this)对象.前者是Javascript对象,而后者是jQuery是对象.两者分清楚,它们只能使用自己的方法.Javascript对象使用Javascript的方法,jQuery对象使 ...