Executors创建的4种线程池的使用
Java通过Executors提供四种线程池,分别为:
newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
注意:线程池只是为了控制应用中处理某项业务中防止高并发问题带来的线程不安全的发生的概率。在我目前的测试用,还没有发现线程可以重用这个概念,因为线程开启后,用完就关闭了,不可以再次开启的,查看源码发现会每次新创建一个线程用来处理业务。我们可以通过线程池指定处理这项业务最大的同步线程数,比如:Executors.newFixedThreadPool(3);在线程池中保持三个线程可以同时执行,但是注意,并不是说线程池中永远都是这三个线程,只是说可以同时存在的线程数,当某个线程执行结束后,会有新的线程进来。newFixedThreadPool.execute(new ThreadForpools());这句话的含义并不是添加新的线程,而是添加新的处理业务请求进来。至少我当前是这么理解的,没有发现线程可以重复使用。
处理线程代码:
package com.alivn.sockets; /*** Created by Alivn on 2017/3/19.*/ public class ThreadForpools implements Runnable{private Integer index;public ThreadForpools(Integer index){this.index=index;}@Overridepublic void run() {/**** 业务......省略*/try {System.out.println("开始处理线程!!!");Thread.sleep(index*100);System.out.println("我的线程标识是:"+this.toString());} catch (InterruptedException e) {e.printStackTrace();}} }
(1) newCachedThreadPool
创建一个可缓存线程池,应用中存在的线程数可以无限大
示例代码如下:
package com.alivn.sockets; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /*** Created by Alivn on 2017/3/19.*/ public class Threadpools {/*** 我们获取四次次线程,观察4个线程地址* @param args*/public static void main(String[]args){ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();System.out.println("****************************newCachedThreadPool*******************************");for(int i=0;i<4;i++){final int index=i;newCachedThreadPool.execute(new ThreadForpools(index));}} }
输出结果是:可以有无限大的线程数进来(线程地址不一样)
(2) newFixedThreadPool
创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。示例代码如下:
package com.alivn.sockets; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /*** Created by Alivn on 2017/3/19.*/ public class Threadpools {/*** 我们获取四次次线程,观察4个线程地址* @param args*/public static void main(String[]args){//线程池允许同时存在两个线程ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(2);System.out.println("****************************newFixedThreadPool*******************************");for(int i=0;i<4;i++){final int index=i;newFixedThreadPool.execute(new ThreadForpools(index));}} }
输出结果:每次只有两个线程在处理,当第一个线程执行完毕后,新的线程进来开始处理(线程地址不一样)
(3) newScheduledThreadPool
创建一个定长线程池,支持定时及周期性任务执行。延迟执行示例代码如下:
package com.alivn.sockets; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit;/*** Created by Alivn on 2017/3/19.*/ public class Threadpools {/*** 我们获取四次次线程,观察4个线程地址* @param args*/public static void main(String[]args){ScheduledExecutorService newScheduledThreadPool = Executors.newScheduledThreadPool(2);System.out.println("****************************newFixedThreadPool*******************************");for(int i=0;i<4;i++){final int index=i;//延迟三秒执行newScheduledThreadPool.schedule(new ThreadForpools(index),3, TimeUnit.SECONDS);}} }
执行结果:延迟三秒之后执行,除了延迟执行之外和newFixedThreadPool基本相同,可以用来执行定时任务
4) newSingleThreadExecutor
创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。示例代码如下:
package com.alivn.sockets; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit;/*** Created by Alivn on 2017/3/19.*/ public class Threadpools {/*** 我们获取四次次线程,观察4个线程地址* @param args*/public static void main(String[]args){ExecutorService newSingleThreadExecutor = Executors.newSingleThreadExecutor();System.out.println("****************************newFixedThreadPool*******************************");for(int i=0;i<4;i++){final int index=i;newSingleThreadExecutor.execute(new ThreadForpools(index));}} }
执行结果:只存在一个线程,顺序执行
from: https://www.cnblogs.com/ljp-sun/p/6580147.html
Executors创建的4种线程池的使用相关推荐
- Java通过Executors提供四种线程池
http://cuisuqiang.iteye.com/blog/2019372 Java通过Executors提供四种线程池,分别为: newCachedThreadPool创建一个可缓存线程池,如 ...
- java中executors_Java通过Executors提供四种线程池
http://cuisuqiang.iteye.com/blog/2019372 Java通过Executors提供四种线程池,分别为: newCachedThreadPool创建一个可缓存线程池,如 ...
- 05-Java通过Executors提供四种线程池
文章目录 1.概述 2.内置线程池 2.1 newCachedThreadPool 2.2 newFixedThreadPool 2.2 newScheduledThreadPool 2.4 newS ...
- Java ExecutorService四种线程池的例子与说明
1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? new Thread(new Runnable() {@Overridepublic void run() {// ...
- java常用的几种线程池
1. 为什么使用线程池 诸如 Web 服务器.数据库服务器.文件服务器或邮件服务器之类的许多服务器应用程序都面向处理来自某些远程来源的大量短小的任务.请求以某种方式到达服务器,这种方式可能是通过网络协 ...
- Java四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor...
1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? Java new Thread(new Runnable() {@Override public void run ...
- java中四种线程池的区别
本文按: 一. 线程池的使用 二. 几种线程池的区别 三. 如何合理配置线程池 一.线程池的使用 在Java中,通常使用Executors 获取线程池.常用的线程池有以下几种: (1)CachedTh ...
- Java四种线程池的使用
FixedThreadPool 由Executors的newFixedThreadPool方法创建.它是一种线程数量固定的线程池,当线程处于空闲状态时,他们并不会被回收,除非线程池被关闭.当所有的线程 ...
- [转]new Thread的弊端及Java四种线程池的使用
介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端 执行一个异步任务你还只是如下new ...
最新文章
- 「长文」2022年企业数字化转型的八大趋势
- 怎么用python进行回归预测_使用Python训练回归模型并进行预测
- Codechef August Challenge 2018 : Coordinate Compression
- 前端实现3d效果_前端动画效果实现的简单比较
- error: failed to push some refs to ‘......‘解决方案
- 【jQuery】实现QQ联系人分组动画
- java 中的流_深入理解Java中的流(Stream)
- 【python】装饰器小结(被装饰函数有/无返回值情况,保留被装饰函数信息)
- 如何将nideshop部署到本地
- 汉语转拼音(带音调和多音字识别)
- linux android投屏,Github开源Android投屏软件——Scrcpy
- python 金融发欺诈_python金融反欺诈-项目实战
- HDU 3966 Aragorns Story
- 计算机如何连接wifi台式,台式电脑怎么连wifi
- 牛客NC23053月月查华华的手机 题解(指针优化)
- 万兆以太网选择6类线还是6A类线?
- 物联无线自动窗帘:窗帘收放更自如-智能家居
- 为什么批量注册Facebook账号需要使用指纹浏览器防关联
- NS2仿真中nam节点颜色设置
- 学生成绩排名及管理系统c语言,学生成绩管理系统__C语言版.doc
热门文章
- Advice for students of machine learning--转
- 解决两台centos虚拟机Telnet服务无法联机的问题
- 【风控术语】数字金融欺诈行为名词表
- linux下的time函数们
- 微软亚洲研究院刘铁岩博士:迎接深度学习的“大”挑战(一)
- 湖南2021年计算机一级考试,2021年湖南计算机一级考试时间(4页)-原创力文档...
- MySQL - 无索引行锁升级为表锁
- MySQL-性能优化_影响MySQL性能的因素分析及解决方案
- 实战SSM_O2O商铺_29【商品】商品添加之Service层的实现及重构
- 【Linux】【服务器】 CentOS7下安装MySQL详细过程步骤