Java中线程池的基本使用

参考这个课程,讲的非常详细 



27.线程池使用步骤总结_哔哩哔哩_bilibili

应用场景

商品秒杀
 

文件上传
 

订票系统


自定义线程池(让我们了解底层逻辑的)


 

构造方法


 

饱和机制
 

就是我们的队列饱和后我们该怎么处理
 

是拒绝这个任务还是啥

 

工作流程介绍




 


 


 

参数设计和分析
 

核心线程数量和任务队列长度


 


 

最大线程数和最大空闲时间



 

线程类和任务类代码实现


 


 

MyTask 是我们的线程类,我们连接了Runnable接口


 

MyWork是我们的任务执行类,连接Thread接口,里面执行run()方法


 

线程类和测试类编写
 

线程池类


 


 


 


 

提交任务,我们把任务扔到List队列里面


 


 

执行任务


 



 

测试类
 


 

逻辑
 

MyTasks提交任务给线程池MythreadPool
 

MyThreadPool再用任务类MyWorker来执行
总结

用.start()调用MyWorker类里面的run方法
 

传过去的Runnable类型,是Task任务类,我们用start()调用里面的run()方法


Java内置线程池

ExecutorService介绍
 


 


 

Executors工厂类介绍
 


 


 

newCachedThreadPool() 创建一个默认的线程池对象,里面的线程可重用,且在第一次使用时才创建
 

newCachedThreadPool(ThreadFacotry threadfactory)线程池中的所有线程都使用ThreadFacotry来创建,这样的线程无需手动启动,自动执行
 


 

newFixThreadPool() 创建一个可重用固定线程数的线程池
 

newFixThreadPool(ThreadFacotry threadfactory) 创建一个可重用固定线程数的线程池,且线程池中的所有线程都使用ThreadFacotry来创建
 


 

newSingleThreadExecutor() 创建一个使用单个worker线程的Executor,以无界队列方式来运行该线程
 

newSingleThreadExecutor(ThreadFacotry threadfactory)
 

创建一个使用单个worker线程的Executor,且线程池中的所有线程都使用ThreadFacotry来创建
 


 

newCachedThreadPool()获取ExcecutorService并且提交任务


 


 

反正就是,要执行的类,要连接Runnable接口,然后把这个连接了Runnable接口的类传给线程池
 

使用工厂类来创建线程池对象
 

control+p,观察一下形参


 

new ThreadFactory(),实现一个匿名内部类方法


 

然后我们的内部是return一个Thread
 

这里面的形参可以指定我们的线程的名称等等


无限个线程


newFixedThreadPool


 

加多了个指定线程数量


 


 

指定了3个线程,所以最多用到3个线程
 

Single,只有一个线程


 


 


 


 

shutDown和shutDownNow方法


 

shutDown,不能再提交新的任务了


 


 

shutDownNow


 

ScheduleExecutorService获取方式和常用方法介绍
 

如果我们还有其他需求
 

例如我们提交后我们想延迟一段时间
 

或者我们想每次间隔一段时间

 

允许延时任务和定时任务


 


 

延迟执行任务入门练习
 

我们的延迟任务不用start()了,用schedule(任务,延迟时间,时间的单位)


 


 

scheduleAtFixedRate()方法执行任务
 


 

如果我们用ThreadFactory()工厂创建后
 

我们用scheduleAtFixRate()来提交任务

 

scheduleWithFixedDelay()方法执行任务
 

和上面那种方法的不同,在于时间间隔的不同


 

任务执行时间不记录到间隔时间之内
 

任务结束之后才开始计算时间

 

Single线程池用这个方法调用


 



 

总结


 


Future介绍(异步计算结果)
 



 

submit()方法里面


 

形参是Callable类型
 

或者Runnable类型
 

是有返回值的
 



 

这个返回值就是我们的异步计算结果
 

有时候我们需要获取线程的计算结果来进行计算


 

方法

cancel()
 

get()
 

isCancelled()
 

isDone()
 


 

Future代码展示
 


 


 

submit()的返回值类型是Callable类型
 

也就是我们的Future类型
 

然后这个里面有我们的异步计算结果,可以根据它来进行操作
 

结束后记得关闭线程池



 


 


 

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

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

相关文章

Aria2 任意文件写入漏洞

目录 Aria2介绍漏洞描述漏洞复现 Aria2介绍 Aria2是一个在命令行下运行,多协议,多来源下载工具(HTTP / HTTPS,FTP,BitTorrent,Metalink),内建XML-RPC用户界面。Aria提供RPC服务器&a…

流媒体服务器一:使用成熟的流媒体SRS 搭建 RTMP流媒体服务器

1 安装和测试srs流媒体服务器 服务器:SRS(Simple RTMP Server,⽀持RTMP、HTTP-FLV,HLS) 推流端:ffmpeg OBS 拉流端:ffplay VLC srs播放器 1.1 安装srs流媒体服务器 官网 SRS (Simple Realtime Server) | SRS 码…

18746 逆序数

这个问题可以使用归并排序的思想来解决。在归并排序的过程中,我们可以统计逆序数的数量。当我们合并两个已经排序的数组时,如果左边的数组中的元素��于右边的数组中的元素,那么就存在逆序,逆序数的数量就是…

数据库之索引

目录 一、索引概述 1.索引的概念和特点 2.索引的分类 3.索引设计的原则 二、创建和查看索引 1.在创建表的时候创建索引 1.创建和查看普通索引 2.创建组合索引 3.创建唯一索引 4.创建全文索引 5.创建空间索引 2.在已有的表上创建索引 1.使用ALTER TABLE语句创建索引…

IEC104转MQTT网关支持MQTT对接Ignition、阿里云、华为云、亚马逊AWS、ThingsBoard、Zabbix平台助力远程管理

钡铼推出了一款专为电力系统设计的数据采集网关——IEC104转MQTT网关BE113,感兴趣的朋友接着往下看: 一、网关概述 IEC104转MQTT(Ignition)网关BE113是一款专为电力系统设计的数据采集网关,支持DL/T645和IEC104等协议的设备。上行支持MQTT协…

二、3 函数递归

自己间接或直接调用自己(可大大减少代码量) 1、举例 2、递归必须有停下来的条件 3、举例 普通求解数组长度 递归求解

16 敏捷开发实践(1)

敏捷方法:是一种从1990年代开始逐渐引起广泛关注的一些新型软件开发方法,是一种应对快速变化的需求的一种软件开发能力。 敏捷开发:是一种以人为核心、迭代、循序渐进的开发方法。 敏捷实践:精益软件开发(LSD&#x…

iexcel-excel 大文件读取和写入-02-Excel 引导类简介

excel 系列 Excel Export 踩坑注意点导出方案设计 基于 hutool 的 EXCEL 优化实现 iexcel-excel 大文件读取和写入,解决 excel OOM 问题-01-入门介绍 iexcel-excel 大文件读取和写入-02-Excel 引导类简介 iexcel-excel 大文件读取和写入-03-ExcelField 注解介绍…

Java进制,进制的转换

目录 进制 进制介绍 案例演示 进制的图示 进制的转化(基本功) 二进制转换成十进制 八进制转换成十进制 十六进制转换成十进制 十进制转换成二进制 十进制转换成八进制 十进制转换成十六进制 二进制转换成八进制 二进制转换成十六进制 …

Linux信号上

信号 概念 信号是由于进程产生,但是由内核调度传递给另一个进程: 产生信号 按键产生信号: Ctrc --> 2)SIGINT(终止/中断) Ctrz --> 20)SIGTSTOP(终端暂停) Ctr\ --> 3)SIGQUIT(退出) 系统调用产生: kill(2), raise, abort软件条件产生: 如定…

泛型如何定义和使用?

根据使用的地方分为3种,分别是泛型类,泛型方法和泛型接口。 (1)泛型类 泛型类的定义 在类名的后面加一对尖括号,括号中填写类型参数,参数可以有多个,多个参数之间使用逗号分隔。 下面是一个…

从与原始的Transformer architecture比较来理解GPT

从与原始的Transformer architecture比较来理解GPT flyfish 一、Transformer architecture 先说名词 不同的文献和资料中有不同的名字,其实是一样的意思 1 编码器-解码器多头注意力机制(Encoder-Decoder Multi-Head Attention Mechanism) …

ASP.NET Core中上传文件

1.创建一个文件上传的表单 在一个视图中&#xff08;比如Index.cshtml&#xff09;&#xff0c;添加一个表单来让用户选择文件并上传。 model IFormFile <form method"post" enctype"multipart/form-data"> <div class"form-group"…

爬虫-实战爬取虎扑ACG帖子

要求如下: 爬取虎扑步行街 ACG 版面的数据,要求使用多线程来并发爬取。范围是第一页的所有帖子,每个帖子包含标题、主题内容和第一页的所有回复内容。最后打印出爬到的所有帖子的标题。 网址是:ACG圈 - 虎扑社区。 针对上面的要求,我们进行分析: 首先是要使用多线程范…

韩顺平0基础学java——第39天

p820-841 jdbc和连接池 1.JDBC为访问不同的数据库提供了统一的接口&#xff0c;为使用者屏蔽了细节问题。 2.Java程序员使用JDBC&#xff0c;可以连接任何提供了JDBC驱动程序的数据库系统&#xff0c;从而完成对数据库的各种操作。 3.jdbc原理图 JDBC带来的好处 2.JDBC带来的…

结构体笔记

结构体 C语言中的数据类型&#xff1a; 基本数据类型&#xff1a;char/int/short/double/float/long 构造数据类型&#xff1a;数组&#xff0c;指针&#xff0c;结构体&#xff0c;共用体&#xff0c;枚举 概念&#xff1a; 结构体是用户自定义的一种数据类型&#xff0c…

flink 实现大数据实时数据采集

Apache Flink 是一个流处理框架&#xff0c;用于处理无界和有界数据流。在大数据实时数据采集领域&#xff0c;Flink 凭借其高吞吐量、低延迟和精确的状态管理特性&#xff0c;成为了实现实时数据处理的理想选择。下面将介绍如何使用 Flink 来实现大数据的实时数据采集和处理。…

《Milvus Cloud向量数据库指南》——ChatGLM:从GLM-130B到GLM-4

ChatGLM:从GLM-130B到GLM-4的跨越:智谱AI在通用人工智能领域的深度探索与实践 在人工智能的浩瀚星空中,智谱AI如同一颗璀璨的新星,以其独特的技术视角和坚定的创新步伐,在通用人工智能(AGI)的征途上留下了深刻的足迹。技术生态总监贾伟在近期的一次分享中,不仅为我们描…

20.rabbitmq插件实现延迟队列

问题 前面谈到基于死信的延迟队列&#xff0c;存在的问题&#xff1a;如果第一个消息延时时间很长&#xff0c;而第二个消息延时时间很短&#xff0c;第二个消息并不会优先得到执行。 下载插件 地址&#xff1a;https://github.com/rabbitmq/rabbitmq-delayed-message-excha…