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 ...
最新文章
- DataGrid连接Access的快速分页法(2)——SQL语句的选用(升序与降序)
- jQuery的ajax使用场景讨论(c#)
- Apache Solr schema.xml及solrconfig.xml文件中文注解
- python热力图背景_python 绘制场景热力图的示例
- JUnit3 一次运行多个测试类和进行多次重复测试:使用测试套件和RepeatedTest
- java即时编译器_Java即时编译:不仅仅是一个流行词
- python tvtk库_PyCharm创建虚拟环境 和 TVTK库的安装
- mysql 手动执行event_MYSQL 定时自动执行EVENT
- 分布式系统监视zabbix讲解十之监控tomcat--技术流ken
- qq浏览器插件_惊艳与吐槽:QQ浏览器升级到 Chromium70 内核以后
- android常见的面试题,Android常见笔试面试题
- [030] 微信公众帐号开发教程第6篇-文本消息的内容长度限制揭秘(转)
- 锐捷客户端linux安装,锐捷smp客户端安装(linux)
- 可能是最全的前端动效库汇总
- 用python处理excel视频教程_从零基础开始用Python处理Excel数据(第一季)课件+资料...
- JavaScript设计模式之装饰者模式
- 王者荣耀高清壁纸下载(多线程、详细解析)
- Hexo主题next中添加天气插件(心知天气)
- 本地win10安装的MySQL8.0.12用navicat12报错 2509 -Authentication plugin ' caching_sha2_password' cannot be :
- 大学计算机作业互评评语简短,大学学生互评评语简短
热门文章
- zookeeper源码分析之五服务端(集群leader)处理请求流程
- 图片路径上传的配置问题
- vue-router参数传递
- 谷歌深度学习四大教训:应用、系统、数据及原理(附数据集列表)
- Spring5源码 - 06 Spring Bean 生命周期流程 概述 01
- MySQL-索引优化篇(4)_索引的维护
- Quartz-Trigger详解
- android tools ignore,android 中tools:ignore=UselessParent这个属性的含义是什么?
- java的lr词法编译器_Sample语言编译器(词法分析、正规式、LL、LR、 算符优先)...
- java web 播放音频_使用Java ME以流形式播放Web服务器上的音乐文件