ThreadPoolExecutor 线程池
TestThreadPoolExecutorMain
package core.test.threadpool; import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit; /**
* ThreadPoolExecutor 线程池
* 构造函数参数
*
* 1、corePoolSize 核心线程数大小,当线程数 < corePoolSize ,会创建线程执行 runnable
*
* 2、maximumPoolSize 最大线程数, 当线程数 >= corePoolSize的时候,会把 runnable 放入 workQueue中
*
* 3、keepAliveTime 保持存活时间,当线程数大于corePoolSize的空闲线程能保持的最大时间。
*
* 4、unit 时间单位
*
* 5、workQueue 保存任务的阻塞队列
*
* 6、threadFactory 创建线程的工厂
*
* 7、handler 拒绝策略
*
* 任务执行顺序 (核心线程数,阻塞队列,最大线程数,异常)
*
* 1、当线程数小于 corePoolSize时,创建线程执行任务。
*
* 2、当线程数大于等于 corePoolSize并且 workQueue 没有满时,放入workQueue中
*
* 3、线程数大于等于 corePoolSize并且当 workQueue 满时,新任务新建线程运行,线程总数要小于 maximumPoolSize
*
* 4、当线程总数等于 maximumPoolSize 并且 workQueue 满了的时候执行 handler 的
* rejectedExecution。也就是拒绝策略。
*
* 四个拒绝策略
*
* ThreadPoolExecutor默认有四个拒绝策略:
*
* 1、ThreadPoolExecutor.AbortPolicy() 直接抛出异常RejectedExecutionException
*
* 2、ThreadPoolExecutor.CallerRunsPolicy() 直接调用run方法并且阻塞执行
*
* 3、ThreadPoolExecutor.DiscardPolicy() 直接丢弃后来的任务
*
* 4、ThreadPoolExecutor.DiscardOldestPolicy() 丢弃在队列中队首的任务
*
* 当然可以自己继承RejectedExecutionHandler来写拒绝策略.
*
* @author chenyd 2017年10月24日
*/
public class TestThreadPoolExecutor {
public static void main(String[] args) {
Long currentTimeMillis = System.currentTimeMillis();
// new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime,
// unit, workQueue)
ThreadPoolExecutor threadpool = new ThreadPoolExecutor(3, 10, 3, TimeUnit.SECONDS,
new ArrayBlockingQueue<Runnable>(3)); for (int i = 0; i < 100; i++) { try {
String task = "task=" + i;
System.out.println("创建任务并提交到线程池:" + task);
threadpool.execute(new ThreadPoolTast(task)); Thread.sleep(100);
} catch (Exception e) {
e.printStackTrace();
} } try {
threadpool.shutdown();
boolean loop = true; do {
loop = !threadpool.awaitTermination(2, TimeUnit.SECONDS);
} while (loop); if (loop != true) {
System.out.println("所有线程执行完毕");
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
System.out.println("耗时:" + (System.currentTimeMillis() - currentTimeMillis));
} }
}
ThreadPoolTast
package core.test.threadpool;
import java.io.Serializable;
public class ThreadPoolTast implements Runnable, Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private Object attachData;
public ThreadPoolTast(Object tasks) {
this.attachData=tasks;
}
@Override
public void run() {
try {
System.out.println("开始执行任务:"+attachData+"任务,使用线程池,线程名称:"+Thread.currentThread().getName());
} catch (Exception e) {
e.printStackTrace();
}
attachData=null;
}
}
参考链接:
Java四种线程池的使用 http://cuisuqiang.iteye.com/blog/2019372
ThreadPoolExecutor 线程池的更多相关文章
- 13.ThreadPoolExecutor线程池之submit方法
jdk1.7.0_79 在上一篇<ThreadPoolExecutor线程池原理及其execute方法>中提到了线程池ThreadPoolExecutor的原理以及它的execute方法 ...
- ThreadPoolExecutor 线程池的源码解析
1.背景介绍 上一篇从整体上介绍了Executor接口,从上一篇我们知道了Executor框架的最顶层实现是ThreadPoolExecutor类,Executors工厂类中提供的newSchedul ...
- j.u.c系列(01) ---初探ThreadPoolExecutor线程池
写在前面 之前探索tomcat7启动的过程中,使用了线程池(ThreadPoolExecutor)的技术 public void createExecutor() { internalExecutor ...
- Java并发——ThreadPoolExecutor线程池解析及Executor创建线程常见四种方式
前言: 在刚学Java并发的时候基本上第一个demo都会写new Thread来创建线程.但是随着学的深入之后发现基本上都是使用线程池来直接获取线程.那么为什么会有这样的情况发生呢? new Thre ...
- 十、自定义ThreadPoolExecutor线程池
自定义ThreadPoolExecutor线程池 自定义线程池需要遵循的规则 [1]线程池大小的设置 1.计算密集型: 顾名思义就是应用需要非常多的CPU计算资源,在多核CPU时代,我们要让每一个CP ...
- Executors、ThreadPoolExecutor线程池讲解
官方+白话讲解Executors.ThreadPoolExecutor线程池使用 Executors:JDK给提供的线程工具类,静态方法构建线程池服务ExecutorService,也就是Thread ...
- SpringBoot项目框架下ThreadPoolExecutor线程池+Queue缓冲队列实现高并发中进行下单业务
主要是自己在项目中(中小型项目) 有支付下单业务(只是办理VIP,没有涉及到商品库存),目前用户量还没有上来,目前没有出现问题,但是想到如果用户量变大,下单并发量变大,可能会出现一系列的问题,趁着空闲 ...
- 手写线程池,对照学习ThreadPoolExecutor线程池实现原理!
作者:小傅哥 博客:https://bugstack.cn Github:https://github.com/fuzhengwei/CodeGuide/wiki 沉淀.分享.成长,让自己和他人都能有 ...
- 源码剖析ThreadPoolExecutor线程池及阻塞队列
本文章对ThreadPoolExecutor线程池的底层源码进行分析,线程池如何起到了线程复用.又是如何进行维护我们的线程任务的呢?我们直接进入正题: 首先我们看一下ThreadPoolExecuto ...
随机推荐
- linux子系统的初始化_subsys_initcall()
http://my.oschina.net/u/572632/blog/305492#OSC_h1_3
- 通过mysqldumpslow来分析日志
通过mysqldumpslow来分析日志. 将mysql加入到全局变量中!!! sudo vim /etc/profile # 添加Mysql export PATH=$PATH:/usr/local ...
- poj 2771 Guardian of Decency 解题报告
题目链接:http://poj.org/problem?id=2771 题目意思:有一个保守的老师要带他的学生来一次短途旅行,但是他又害怕有些人会变成情侣关系,于是就想出了一个方法: 1.身高差距 ...
- AJAX 用户验证方法
JSP <td width="10%" class="main_matter_td">真实姓名</td> <td width=&q ...
- WAS:修改jsp编译器用JDK5.0
问题现象: 今天有现场反映,访问应用的个别页面报错,报错内容如下: 于是先查看其他现场,都是好的:根据报错信息,提示的意思是jsp解析不了. 结合上面2个情况,排除代码问题,应该是现场WAS环境问 ...
- [原创]Java生成Word文档
在开发文档系统或办公系统的过程中,有时候我们需要导出word文档.在网上发现了一个用PageOffice生成word文件的功能,就将这块拿出来和大家分享. 生成word文件与我们编辑word文档本质上 ...
- skynet实践(8)-接入websocket
我从开源项目(https://github.com/lipp/lua-websockets,这里我们简称LWS)中抽出了websocket的部分处理,步骤如下: 1)首先是解决LWS的几个依赖问题.L ...
- [POI 2007] 办公楼
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1098 [算法] 显然 , 答案为补图的连通分量个数 用链表优化BFS , 时间复杂度 ...
- C++标准编程:虚函数与内联
我们曾经在讨论C++的时候,经常会问到:“虚函数能被声明为内联吗?”现在,我们几乎听不到这个问题了.现在听到的是:“你不应该使print成为内联的.声明一个虚函数为内联是错误的!” 这种说法的两个主要 ...
- this调用属性
示例: class Person{ private String name; private int age; public Person(String name,int age){ this.nam ...