线程池的实现

1.创建线程池

API提供了一个工具类叫Executors,可以用它的方法生成不同特点的线程池,返回一个ExecutorService对象。

<1>Executors.newCachedThreadPool() 【池子中默认是空的,最多可以容纳int类型的最大值】

<3>Executors.newSingleThreadExecutor() 【单个线程的线程池】

//都为工具类Executors的静态方法,返回一个ExecutorService对象
public class Demo1 {public static void main(String[] args) throws InterruptedException {//1.Executors.newCachedThreadPool()//创建一个默认的线程池对象,池子中默认是空的,最多可以容纳int类型的最大值ExecutorService executorService = Executors.newCachedThreadPool();//Executors---可以帮助我们创建线程池对象//ExecutorService---可以帮助我们控制线程池对象//3.单个线程的线程池//ExecutorService executorService2 = Executors.newSingleThreadExecutor();executorService.submit(() -> {System.out.println(Thread.currentThread().getName()+"在执行了");});executorService.submit(() -> {System.out.println(Thread.currentThread().getName()+"在执行了");});//由于第一个线程还没结束。第二个线程就开始,所以打印结果有两个线程System.out.println("--------------------------------------------");executorService.submit(() -> {System.out.println(Thread.currentThread().getName() + "在执行了");});//让主线程睡眠1秒Thread.sleep(1000);executorService.submit(new Runnable() {@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + "在执行了");}});//由于第一个线程已经归还完毕。第二个线程才开始,所以它会复用第线程池的线程,打印线程数不会增加executorService.shutdown();//关闭线程池}
}打印结果:
-----------------------------------------------------------------------------------------
--------------------------------------------
pool-1-thread-3在执行了
pool-1-thread-1在执行了
pool-1-thread-2在执行了
pool-1-thread-1在执行了
<2>Executors.newFixedThreadPool()【参数不是初始值,而是最大值[提交数超过线程数,不会报错,而是复用线程]】 <4>Executors.newScheduledThreadPool()【安排在给定周期执行某一个任务】
public class Demo2 {public static void main(String[] args) {//2.Executors.newFixedThreadPool()创建一个指定最多线程数量的线程池//参数不是初始值,而是最大值[提交数超过线程数,不会报错,而是复用线程]//ExecutorService executorService = Executors.newFixedThreadPool(2);ExecutorService executorService1 = Executors.newFixedThreadPool(2);executorService1.submit(() -> {System.out.println(Thread.currentThread().getName()+"在执行了");});executorService1.submit(() -> {System.out.println(Thread.currentThread().getName()+"在执行了");});executorService1.submit(() -> {System.out.println(Thread.currentThread().getName()+"在执行了");});//提交数为3,则会复用前面的线程//4.安排在给定周期执行某一个任务//Executors.newScheduledThreadPool()ScheduledExecutorService executorService = Executors.newScheduledThreadPool(3);executorService.scheduleAtFixedRate(new Runnable() {@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + "执行了");}}, 3, 5, TimeUnit.SECONDS);//初始延迟3秒,每5秒执行一次}
}打印结果:
-----------------------------------------------------------------------------------------
pool-1-thread-1在执行了
pool-1-thread-2在执行了
pool-1-thread-1在执行了
pool-2-thread-1执行了
pool-2-thread-1执行了
pool-2-thread-2执行了
2.自定义线程池
//2.自定义线程池
//参数一:核心线程数量 【不能小于0】
//参数二:最大线程数  【不能小于等于0,最大数量》=核心线程数】
//参数三:空闲线程最大存活时间 【不能小于0】
//参数四:时间单位 【TimeUnit】
//参数五:任务队列【不能为null】 让任务在队列中等待,等线程空闲了,再从这个队列中获取任务并执行
//参数六:创建线程工厂【不能为null】 //创建和销毁的地方
//参数七:任务的拒绝策略【不能为null】  如果超过最大线程数的拒绝方案
public class Demo1 {public static void main(String[] args) {//创建线程池对象ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2,//核心线程数量10,//最大线程数2,//空闲线程最大存活时间TimeUnit.HOURS,//时间单位new ArrayBlockingQueue<>(10),//任务队列Executors.defaultThreadFactory(),//创建线程工厂new ThreadPoolExecutor.AbortPolicy()//任务的拒绝策略[超出任务接收最大值则抛出异常]);//提交任务for (int i = 0; i < 3; i++) { //提交任务最大数为10+10【池中最大线程数+队列容量】threadPoolExecutor.submit(new Runnable() {@Overridepublic void run() {System.out.println(Thread.currentThread().getName()+"执行了");}});}}
}打印结果:
---------------------------------------------------------------------------------------------------
pool-1-thread-2执行了
pool-1-thread-1执行了
pool-1-thread-2执行了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/330814.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JSON Web Token (JWT),服务端信息传输安全解决方案

转载自 JSON Web Token (JWT)&#xff0c;服务端信息传输安全解决方案JWT介绍 JSON Web Token(JWT)是一种开放标准(RFC 7519)&#xff0c;它定义了一种紧凑独立的基于JSON对象在各方之间安全地传输信息的方式。这些信息可以被验证和信任&#xff0c;因为它是数字签名的。JWTs可…

thinking-in-java(18) java io

【0】README&#xff1a;本篇文章是以 thinking in java 为基础梳理的&#xff1b; 【18.1.1 目录列表器】 // 传入正则表达式以过滤文件名如 (.*src)* public class DirList {public static void main(String[] args) {File path new File(".");String[] list; i…

并发工具类【线程安全相关的类】

1.Hashtable和ConcurrentHashMap Hashtable&#xff1a;哈希表结构&#xff08;数组链表&#xff09;&#xff0c;线程安全的(同步代码块&#xff0c;效率低) ConcurrentHashMap&#xff1a; jdk7:采用Segment数组[不会扩容] HashEntry[二次哈希计算存入的位置,可扩容]&#…

JSON Web Token (JWT)生成Token及解密实战

转载自 JSON Web Token (JWT)生成Token及解密实战昨天讲解了JWT的介绍、应用场景、优点及注意事项等&#xff0c;今天来个JWT具体的使用实践吧。从JWT官网支持的类库来看&#xff0c;jjwt是Java支持的算法中最全的&#xff0c;推荐使用&#xff0c;网址如下。https://github.co…

java中两个map的融合(两个map有相同字段)

试想这样一个场景&#xff1a; 数据库表中 有 城市信息表 city_tbl&#xff1b; 有院士信息表 ys_tbl &#xff0c;其中院士有城市id字段&#xff08;id&#xff09;&#xff1b; 但是不是所有城市都有院士&#xff1b; 我们想要得到 城市的详细信息&#xff0c;包括院士个数…

网络编程实现

1.网络编程三要素 1.IP地址&#xff1a;网络中设备的唯一标识IPv4: 由4个字节组成&#xff0c;点分十进制表示法IPv6: 由16个字节组成&#xff0c;冒分十六进制表示法"127.0.0.1"本地主机网络地址【用于测试】相关命令&#xff1a;ipconfig: 查看本机在当前网络环境…

通用唯一标识码UUID的介绍及使用

转载自 通用唯一标识码UUID的介绍及使用。什么是UUID&#xff1f; UUID全称&#xff1a;Universally Unique Identifier&#xff0c;即通用唯一识别码。 UUID是由一组32位数的16进制数字所构成&#xff0c;是故UUID理论上的总数为16^32 2^128&#xff0c;约等于3.4 x 10^38。也…

IEEE论文检测的字体未嵌入问题Times New Roman,Bold, Times New Roman,Italic is not embedded解决方法

【1】README 毕业前写了一篇 英文paper&#xff0c; 接受后&#xff0c;需要提交到 IEEE PDF Express 做格式检测&#xff1b;&#xff1b;latex源码中引用了 Visio生成的算法流程图&#xff0c;PDF文件&#xff1b; 谁料&#xff0c;哥子提交上去后&#xff0c;报如下错误&…

类加载器的创建

1.什么是类加载器 <1>概念&#xff1a;类加载器是用来加载类的工具(从硬盘加载到JVM内存) <2>类加载器的加载时机【类在使用时才被加载&#xff0c;不使用不加载】 a.创建类的对象时 b.通过类名调用静态方法时 c.通过反射加载类 <3>3.类加载器的分类 a.启动…

Java 必看的 Spring 知识汇总

转载自 Java 必看的 Spring 知识汇总Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而&#xff0c;Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性的角度而言&#xff0c;绝大部分Java应用…

Java 截取反斜杠--java使用split拆分特殊字符

orgn link : http://blog.csdn.net/scy411082514/article/details/7987852 Java 截取反斜杠 replaceAll和split &#xff08;“\”&#xff09; 问题解决办法 2009年07月15日 星期三 上午 11:26 xxx.split("\\") 显然得不到想要的结果 正确方法 xxx.split(&qu…

反射的实现

1.获取类的字节码对象 //获取类的字节码对象 public class Demo1 {public static void main(String[] args) throws ClassNotFoundException {//方式1&#xff1a;类名.ClassClass<?> clazz1 Student.class;//方式2&#xff1a;对象名.getClass()Student student new…

thinking-in-java(11) 持有对象

【11.1】泛型和类型安全的容器 &#xff08;1&#xff09;ArrayList<Apple> 中尖括号括起来的是&#xff1a; 类型参数&#xff0c;它指定了这个容器实例可以保存的类型&#xff1b; 【荔枝&#xff1a;有泛型和没有泛型的区别】 class Apple {private static long coun…

JDK9新特性实战:简化流关闭新姿势

转载自 JDK9新特性实战&#xff1a;简化流关闭新姿势。做Java开发的都知道&#xff0c;每个资源的打开都需要对应的关闭操作&#xff0c;不然就会使资源一直占用而造成资源浪费&#xff0c;从而降低系统性能。 关于资源的关闭操作&#xff0c;从JDK7-JDK9有了不少的提升及简化。…

XML配置文件

XML的语法 1.xml是由自定义的标签组成 <开始标签>标签体</结束标签> <自闭合标签/> 2.xml文件的语法 1)必须要有一个文档声明 <?xml version"1.0" encoding"UTF-8" ?>2)只有一个根标签3)特殊字符 如< > & 必须使用…

DevExperience(1710)

【1】Date 和 String 互转 // Date 和 String 互转。public static void main(String[] args) {SimpleDateFormat formatter new SimpleDateFormat("yyyyMMdd");// Date 转 StringString curDateStr formatter.format(new Date());System.out.println("curDat…

Java Jar包的压缩、解压使用指南

转载自 Java Jar包的压缩、解压使用指南什么是jar包 JAR&#xff08;Java Archive&#xff09;是Java的归档文件&#xff0c;它是一种与平台无关的文件格式&#xff0c;它允许将许多文件组合成一个压缩文件。 如何打/解包 使用jdk/bin/jar.exe工具&#xff0c;配置完环境变量后…

枚举的实现

1.枚举的概念 枚举就是把几个固定的常量列举出来。枚举本质上也是一个类&#xff0c;只不过这个类的对象是几个固定的值&#xff0c;不能让外界创建对象【因为其内部的构造方法私有】 2.定义一个枚举类 public enum Week {//枚举项表示Week类的对象&#xff0c;带括号表示使…

think-in-java(17)容器深入研究

注意&#xff1a; 17章接着 11章继续分析 java容器&#xff0c; think-in-java(11) 【17.1】完整的容器分类方法 【容器分类网络解说】 1&#xff09;接口&#xff1a;虚线框&#xff0c;没有实线入边&#xff08;没有实体类继承关系&#xff0c;只有接口继承关系&#xff09…

浅析负载均衡的6种算法,Ngnix的5种算法

转载自 浅析负载均衡的6种算法&#xff0c;Ngnix的5种算法。 常见的几种负载均衡算法 1、轮询法 将请求按顺序轮流地分配到后端服务器上&#xff0c;它均衡地对待后端的每一台服务器&#xff0c;而不关心服务器实际的连接数和当前的系统负载。 2、随机法 通过系统的随机算法…