java中线程池创建的几种方式
java中创建线程池的方式一般有两种:
- 通过Executors工厂方法创建
- 通过new
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue)自定义创建
Executors工厂方法创建
- package com.javaBase.LineDistancePond;
- import java.util.concurrent.ExecutorService;
- import java.util.concurrent.Executors;
- import java.util.concurrent.ScheduledExecutorService;
- import java.util.concurrent.TimeUnit;
- /**
- * 〈一句话功能简述〉;
- * 〈功能详细描述〉
- *
- * @author jxx
- * @see [相关类/方法](可选)
- * @since [产品/模块版本] (可选)
- */
- public class TestThreadPoolExecutor {
- public static void main(String[] args) {
- //创建使用单个线程的线程池
- ExecutorService es1 = Executors.newSingleThreadExecutor();
- for (int i = 0; i < 10; i++) {
- es1.submit(new Runnable() {
- @Override
- public void run() {
- System.out.println(Thread.currentThread().getName() + "正在执行任务");
- }
- });
- }
- //创建使用固定线程数的线程池
- ExecutorService es2 = Executors.newFixedThreadPool(3);
- for (int i = 0; i < 10; i++) {
- es2.submit(new Runnable() {
- @Override
- public void run() {
- System.out.println(Thread.currentThread().getName() + "正在执行任务");
- }
- });
- }
- //创建一个会根据需要创建新线程的线程池
- ExecutorService es3 = Executors.newCachedThreadPool();
- for (int i = 0; i < 20; i++) {
- es3.submit(new Runnable() {
- @Override
- public void run() {
- System.out.println(Thread.currentThread().getName() + "正在执行任务");
- }
- });
- }
- //创建拥有固定线程数量的定时线程任务的线程池
- ScheduledExecutorService es4 = Executors.newScheduledThreadPool(2);
- System.out.println("时间:" + System.currentTimeMillis());
- for (int i = 0; i < 5; i++) {
- es4.schedule(new Runnable() {
- @Override
- public void run() {
- System.out.println("时间:"+System.currentTimeMillis()+"--"+Thread.currentThread().getName() + "正在执行任务");
- }
- },3, TimeUnit.SECONDS);
- }
- //创建只有一个线程的定时线程任务的线程池
- ScheduledExecutorService es5 = Executors.newSingleThreadScheduledExecutor();
- System.out.println("时间:" + System.currentTimeMillis());
- for (int i = 0; i < 5; i++) {
- es5.schedule(new Runnable() {
- @Override
- public void run() {
- System.out.println("时间:"+System.currentTimeMillis()+"--"+Thread.currentThread().getName() + "正在执行任务");
- }
- },3, TimeUnit.SECONDS);
- }
- }
- }
new ThreadPoolExecutor()自定义创建
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler) ;
unit:参数keepAliveTime的时间单位,有7种取值,在TimeUnit类中有7种静态属性:
- TimeUnit.DAYS; //天
- TimeUnit.HOURS; //小时
- TimeUnit.MINUTES; //分钟
- TimeUnit.SECONDS; //秒
- TimeUnit.MILLISECONDS; //毫秒
- TimeUnit.MICROSECONDS; //微妙
- TimeUnit.NANOSECONDS; //纳秒
workQueue:一个阻塞队列,用来存储等待执行的任务,这个参数的选择也很重要,会对线程池的运行过程产生重大影响,一般来说,这里的阻塞队列有以下几种选择:
- ArrayBlockingQueue
- LinkedBlockingQueue
- SynchronousQueue
- PriorityBlockingQueue
threadFactory:用于设置创建线程的工厂,可以通过线程工厂给每个创建出来的线程做些更有意义的事情,比如设置daemon和优先级等等
handler:表示当拒绝处理任务时的策略,有以下四种取值:
- 1、AbortPolicy:直接抛出异常。
- 2、CallerRunsPolicy:只用调用者所在线程来运行任务。
- 3、DiscardOldestPolicy:丢弃队列里最近的一个任务,并执行当前任务。
- 4、DiscardPolicy:不处理,丢弃掉。
- 5、也可以根据应用场景需要来实现RejectedExecutionHandler接口自定义策略。如记录日志或持久化不能处理的任务。
ThreadPoolExecutor 源码理解
- public static void test(int size) {
- ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(5, 20, 2, TimeUnit.SECONDS, new LinkedBlockingQueue<>(5));
- for (int i = 0; i < size; i++) {
- poolExecutor.execute(new DemoTask(i));
- Console.log("poolSize:" + poolExecutor.getPoolSize());
- Console.log("corePoolSize:" + poolExecutor.getCorePoolSize());
- Console.log("maximumPoolSize:" + poolExecutor.getMaximumPoolSize());
- Console.log("queue:" + poolExecutor.getQueue().size());
- Console.log("completedTaskCount:" + poolExecutor.getCompletedTaskCount());
- Console.log("largestPoolSize:" + poolExecutor.getLargestPoolSize());
- Console.log("keepAliveTime:" + poolExecutor.getKeepAliveTime(TimeUnit.SECONDS));
- }
- poolExecutor.shutdown();
- }
- class DemoTask implements Runnable {
- private int taskNum;
- public DemoTask(int taskNum) {
- this.taskNum = taskNum;
- }
- @Override
- public void run() {
- Console.log(StringUtils.center("正在执行" + taskNum, 20, "="));
- try {
- Thread.sleep(2000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- Console.log(StringUtils.center("执行完毕" + taskNum, 20, "="));
- }
- }
执行结果:
- =======正在执行0========
- poolSize:1
- corePoolSize:5
- maximumPoolSize:20
- queue:0
- completedTaskCount:0
- largestPoolSize:1
- keepAliveTime:2
- poolSize:2
- corePoolSize:5
- maximumPoolSize:20
- queue:0
- completedTaskCount:0
- =======正在执行1========
- largestPoolSize:2
- keepAliveTime:2
- poolSize:3
- corePoolSize:5
- maximumPoolSize:20
- =======正在执行2========
- queue:0
- completedTaskCount:0
- largestPoolSize:3
- keepAliveTime:2
- poolSize:4
- corePoolSize:5
- maximumPoolSize:20
- queue:0
- =======正在执行3========
- completedTaskCount:0
- largestPoolSize:4
- keepAliveTime:2
- poolSize:5
- corePoolSize:5
- =======正在执行4========
- maximumPoolSize:20
- queue:0
- completedTaskCount:0
- largestPoolSize:5
- keepAliveTime:2
- poolSize:5
- corePoolSize:5
- maximumPoolSize:20
- queue:1
- completedTaskCount:0
- largestPoolSize:5
- keepAliveTime:2
- poolSize:5
- corePoolSize:5
- maximumPoolSize:20
- queue:2
- completedTaskCount:0
- largestPoolSize:5
- keepAliveTime:2
- poolSize:5
- corePoolSize:5
- maximumPoolSize:20
- queue:3
- completedTaskCount:0
- largestPoolSize:5
- keepAliveTime:2
- poolSize:5
- corePoolSize:5
- maximumPoolSize:20
- queue:4
- completedTaskCount:0
- largestPoolSize:5
- keepAliveTime:2
- poolSize:5
- corePoolSize:5
- maximumPoolSize:20
- queue:5
- completedTaskCount:0
- largestPoolSize:5
- keepAliveTime:2
- poolSize:6
- corePoolSize:5
- maximumPoolSize:20
- queue:5
- completedTaskCount:0
- largestPoolSize:6
- keepAliveTime:2
- poolSize:7
- corePoolSize:5
- maximumPoolSize:20
- queue:5
- completedTaskCount:0
- largestPoolSize:7
- keepAliveTime:2
- =======正在执行11=======
- poolSize:8
- corePoolSize:5
- maximumPoolSize:20
- queue:5
- completedTaskCount:0
- =======正在执行12=======
- =======正在执行10=======
- largestPoolSize:8
- keepAliveTime:2
- poolSize:9
- corePoolSize:5
- =======正在执行13=======
- maximumPoolSize:20
- queue:5
- completedTaskCount:0
- largestPoolSize:9
- keepAliveTime:2
- poolSize:10
- corePoolSize:5
- maximumPoolSize:20
- =======正在执行14=======
- queue:5
- completedTaskCount:0
- largestPoolSize:10
- keepAliveTime:2
- poolSize:11
- corePoolSize:5
- maximumPoolSize:20
- queue:5
- =======正在执行15=======
- completedTaskCount:0
- largestPoolSize:11
- keepAliveTime:2
- poolSize:12
- corePoolSize:5
- maximumPoolSize:20
- queue:5
- completedTaskCount:0
- =======正在执行16=======
- largestPoolSize:12
- keepAliveTime:2
- poolSize:13
- corePoolSize:5
- maximumPoolSize:20
- =======正在执行17=======
- queue:5
- completedTaskCount:0
- largestPoolSize:13
- keepAliveTime:2
- poolSize:14
- corePoolSize:5
- maximumPoolSize:20
- queue:5
- =======正在执行18=======
- completedTaskCount:0
- largestPoolSize:14
- keepAliveTime:2
- poolSize:15
- corePoolSize:5
- maximumPoolSize:20
- =======正在执行19=======
- queue:5
- completedTaskCount:0
- largestPoolSize:15
- keepAliveTime:2
- =======执行完毕0========
- =======正在执行5========
- =======执行完毕1========
- =======执行完毕2========
- =======正在执行6========
- =======正在执行7========
- =======执行完毕4========
- =======正在执行8========
- =======执行完毕3========
- =======正在执行9========
- =======执行完毕13=======
- =======执行完毕12=======
- =======执行完毕10=======
- =======执行完毕11=======
- =======执行完毕15=======
- =======执行完毕16=======
- =======执行完毕14=======
- =======执行完毕19=======
- =======执行完毕18=======
- =======执行完毕17=======
- =======执行完毕5========
- =======执行完毕7========
- =======执行完毕6========
- =======执行完毕8========
- =======执行完毕9========
参考链接:Java线程池(一)
java中线程池创建的几种方式的更多相关文章
- Java中线程池,你真的会用吗?
在<深入源码分析Java线程池的实现原理>这篇文章中,我们介绍过了Java中线程池的常见用法以及基本原理. 在文中有这样一段描述: 可以通过Executors静态工厂构建线程池,但一般不建 ...
- 沉淀再出发:java中线程池解析
沉淀再出发:java中线程池解析 一.前言 在多线程执行的环境之中,如果线程执行的时间短但是启动的线程又非常多,线程运转的时间基本上浪费在了创建和销毁上面,因此有没有一种方式能够让一个线程执行完自己的 ...
- Java中线程池,你真的会用吗?ExecutorService ThreadPoolExcutor
原文:https://www.hollischuang.com/archives/2888 在<深入源码分析Java线程池的实现原理>这篇文章中,我们介绍过了Java中线程池的常见用法以及 ...
- Java 中线程池的 7 种创建方式!
在 Java 语言中,并发编程都是通过创建线程池来实现的,而线程池的创建方式也有很多种,每种线程池的创建方式都对应了不同的使用场景,总体来说线程池的创建可以分为以下两类: 通过 ThreadPoolE ...
- Java中线程池的学习
线程池的基本思想还是一种对象池的思想,开辟一块内存空间,里面存放了众多(未死亡)的线程,池中线程执行调度由池管理器来处理.当有线程任务时,从池中取一个,执行完成后线程对象归池,这样可以避免反复创建线程 ...
- Java中线程池的实现原理
知识点总结 ---------------------------------------------------------------------------------------------- ...
- Java中线程池的实现原理-求职必备
jdk1.5引入Executor线程池框架,通过它把任务的提交和执行进行解耦,只需要定义好任务,然后提交给线程池,而不用关心该任务是如何执行.被哪个线程执行,以及什么时候执行. 初始化线程池(4种) ...
- Java并发--线程间协作的两种方式:wait、notify、notifyAll和Condition
在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界 ...
- java中线程池的几种实现方式
1.线程池简介: 多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力. 假设一个服务器完成一项任务所需时间为:T1 创建 ...
随机推荐
- 商业智能BI不仅仅是报表工具,它的真正价值是:决策支持
作为一个独立系统,商业智能BI解决两个问题.一是信息的发布,它可以在正确的时间向正确的人提供正确的信息.几十年来,我们看到的商业智能项目,至少有90%的项目成果变成了提供信息的报告.这种情况下,改变的 ...
- 商业智能BI必备的特性
商业智能BI的本质对企业来说,商业智能BI不能直接产生决策,而是利用BI工具处理后的数据来支持决策.核心是通过构建数据仓库平台,有效整合数据.组织数据,为分析决策提供支持并实现其价值. 传统的DW/O ...
- 【C# 程序集】C# assembly和module 根本区别
相同点 两者都有:manifest.metadata.IL 不同点 1.assembly 有main程序函数.module只能附属于程序集,程序集可以拥有多个. 2.metadata的差异 程序集特有 ...
- elasticsearch7.8.0,kibana7.8.0安装
目录 Windows下安装Elasticsearch Linux下安装Elasticsearch docker下安装Elasticsearch Kibana安装 chrome ElasticSearc ...
- vue结合webpack打包问题
在使用vue开发项目时,如果要使用其单文件组件特性,必然要使用webpack或者其他打包工具打包,这里我用到的是webpack打包,首先是搭建vue环境和webpack环境,在这里遇到的一个问题是在成 ...
- JZ-045-扑克牌顺子
扑克牌顺子 题目描述 LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张_)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的 ...
- 接口自动化测试框架(Java 实现)
目录 需求分析 开发设计 分层与抽象 技术选型 主要类设计 测试文件设计 工程目录设计 工程实现 github 地址 运行示例 需求分析 需求点 需求分析 通过 yaml 配置接口操作和用例 后续新增 ...
- 当.Net撞上BI可视化,这3种“套路”你必须知道
最近葡萄在做技术支持,又遇到了客户给我们出的新问题. 事情是这样的. 这次客户使用的是.Net项目,直接做BI大屏过于复杂,所以想直接集成使用BI数据可视化分析大屏. 所以,这次我们就从--Wyn出发 ...
- 解决vue单页面应用做微信JSSDK注入权限时出现“invalid signature”(ios端)
--都说微信开发多坑,没想到遇到一个天坑. 在做一个vue项目时,要用到微信JS-SDK,官方文档详见:https://developers.weixin.qq.com/doc/offiaccount ...
- powerful number筛
心血来潮跑来实现以下这个东西 我们应该知道杜教筛的理论是 \(f * g=h\),那么问题在于如何找 \(g\). 之前的blog应该提到过可以令 \(g(p)=-f(p)\),这样一来 \(h\) ...