社区网站建设方案ppt,wordpress个人博客源码,网站建设制作合同模板,html电商网页设计代码1.1 线程#xff1a; 线程就是进程中的单个顺序控制流#xff0c;也可以理解成是一条执行路径
单线程#xff1a;一个进程中包含一个顺序控制流#xff08;一条执行路径#xff09;
多线程#xff1a;一个进程中包含多个顺序控制流#xff08;多条执行路径#xff0…1.1 线程 线程就是进程中的单个顺序控制流也可以理解成是一条执行路径
单线程一个进程中包含一个顺序控制流一条执行路径
多线程一个进程中包含多个顺序控制流多条执行路径
在java语言中 线程A和线程B堆内存和方法区内存共享。 但是栈内存独立一个线程一个栈。
假设启动10个线程会有10个栈空间每个栈和每个栈之间互不干扰各自执行各自的这就是多线程并发。
java中之所以有多线程机制目的就是为了提高程序的处理效率。
对于单核的CPU来说不能够做到真正的多线程并发但是可以做到给人一种“多线程并发”的感觉。对于单核的CPU来说在某一个时间点上实际上只能处理一件事情但是由于CPU的处理速度极快多个线程之间频繁切换执行跟人来的感觉是多个事情同时在做。 1.2 线程的生命周期 1.3 线程池 线程池可以看做是线程的集合。它的工作主要是控制运行的线程的数量处理过程中将任务放入队列然后在线程创建后 启动这些任务如果线程数量超过了最大数量超出数量的线程排队等候等其它线程执行完毕 再从队列中取出任务来执行。他的主要特点为线程复用控制最大并发数管理线程。
1.4 为什么使用线程池 使用线程池最大的原因就是可以根据系统的需求和硬件环境灵活的控制线程的数量且可以对所有的线程进行统一的管理和控制从而提高系统的运行效率降低系统运行压力当然了使用线程池的原因不仅仅只有这些我们可以从线程池自身的优点上来进一步了解线程池的好处。1线程和任务分离提升线程的重用性。
2控制线程的并发数量降低服务器压力统一管理所有的线程。
3提升系统的响应速度假如创建线程用的时间为T1执行任务用的时间为T2销毁线程用的时间为T3那么使用线程就免去了T1和T3的时间。
1.5 线程池的应用场景
1商品秒杀 2云盘文件上传下载 312306 网上购票系统
总之只要是有并发的地方、任务量大或者小、每个任务执行时间长或短的都可以使用线程池只不过在使用线程池的时候注意下设置合理的线程池大小即可 2.1 实现方式 (springboot实现多线程)
1. 自定义线程池配置我自己的项目在没有充分的把握情况下一般不修改手脚架的配置避免出现不明原因。加上我们经理之前也教我能不修改别人的代码尽量不修改别人的代码因为你不确定别人是如何调用的。 /*** xxx业务专用的线程池配置类*/
Configuration
public class TalentIotThreadConfig {/*** ThreadPoolTaskExecutor的处理流程* 当池子大小小于corePoolSize就新建线程并处理请求* 当池子大小等于corePoolSize把请求放入workQueue中池子里的空闲线程就去workQueue中取任务并处理* 当workQueue放不下任务时就新建线程放入线程池并处理请求如果池子大小撑到了maximumPoolSize就用RejectedExecutionHandler来做拒绝处理* 当池子的线程数大于corePoolSize时多余的线程会等待keepAliveTime长时间如果无请求可处理就自行销毁** return*/Bean(TalentIotThread)public ThreadPoolTaskExecutor getAsyncExecutor() {ThreadPoolTaskExecutor tp new ThreadPoolTaskExecutor();//设置核心线程数tp.setCorePoolSize(10);//设置最大线程数tp.setMaxPoolSize(100);//线程使用的缓冲队列tp.setQueueCapacity(10);//设置程序关闭时要等待线程全部执行完tp.setWaitForTasksToCompleteOnShutdown(true);//设置等待时间超过等待时间后立即停止tp.setAwaitTerminationSeconds(60);//线程名称前缀tp.setThreadNamePrefix(talent-iot-task-);//初始化线程tp.initialize();return tp;}}2. 调用ThreadPoolExecutor它的顶级父类是Executor接口只包含了一个方法——execute这个方法也就是线程池的“执行”。 public class IotTimer {//通过注解引入配置Resource(name TalentIotThread)private Executor executor;Scheduled(cron 0 */2 * * * ?)void talIotDataShare() {for (TalIotDateShare iotDateShare : shareList) {executor.execute(() - {// 业务代码 });}}}