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 ...
随机推荐
- POJ2251 Dungeon Master —— BFS
题目链接:http://poj.org/problem?id=2251 Dungeon Master Time Limit: 1000MS Memory Limit: 65536K Total S ...
- set built-in function
集合类型 集合对象是一组无序排列的可哈希的值,集合可以作为字典的键.因为集合是无序的,不可以为集合创建索引或执行切片操作,也没有键可以用来获取元素的值. 集合有两种不同的类型,可变集合和不可变集合.可 ...
- React引入,运行
1.引入 <script src="https://cdn.bootcss.com/react/15.5.4/react.min.js"></script> ...
- oracle:通过shell来运行rman命令
每次都手工输入一批rman命令来进行备份等操作是很繁琐的事,有什么简便的方法吗?可以的,你可以把这批rman命令写在 shell命令里面,需要的时候,运行一下sh即可.下面是一个简单的实例: RMAN ...
- 「NOI2004」「LuoguP1486」郁闷的出纳员
Descrption OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调 ...
- 【Codeforces 582A】 GCD Table
[题目链接] 点击打开链接 [算法] G中最大的数一定也是a中最大的数. G中次大的数一定也是a中次大的数. 第三.第四可能是由最大和次大的gcd产生的 那么就不难想到下面的算法: ...
- http查看工具
View HTTP Request and Response Header Web-Sniffer Desktop App Please check our new free Web-Sniffer ...
- Java调用未被Static修饰的本类方法
public class Dy { public static void main(String[] args){ int a=6; int b=5; int result=0; Dy dy=new ...
- docker容器基础
一.docker容器基础6种名称空间:UTS.MOunt.IPC.PID.User.Net (1) Linux Namespaces:namespace 系统调用参数 隔离内容 内核版本 UTS ...
- 704. Binary Search
Given a sorted (in ascending order) integer array nums of n elements and a target value, write a fun ...