技术栈入门------线程池

简介: 技术栈入门------线程池

线程池的执行流程

任务被提交到线程池,会先判断当前线程数量是否小于corePoolSize(线程池核心线程数量),如果小于则创建线程来执行提交的任务,否则将任务放入workQueue(线程堵塞队列)缓存队列,如果workQueue缓存队列满了,则判断当前线程数量是否小于maximumPoolSize(线程池最大线程数量),如果小于则创建线程执行任务,否则就会调用handler(拒绝策略),以表示线程池拒绝接收任务。


使用线程池的准备工作

(1)在config包里配置线程池的配置类

package com.saodai.saodaimall.order.config;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
 * 线程池配置类
 **/
@EnableConfigurationProperties(ThreadPoolConfigProperties.class)
@Configuration
public class MyThreadConfig {
    @Bean
    public ThreadPoolExecutor threadPoolExecutor(ThreadPoolConfigProperties pool) {
        return new ThreadPoolExecutor(
                //线程池核心线程数量
                pool.getCoreSize(),
                //线程池最大线程数量
                pool.getMaxSize(),
                //线程池(最大线程数量-核心线程数量)的存活时间
                pool.getKeepAliveTime(),
                //存活时间单位
                TimeUnit.SECONDS,
                //线程堵塞队列
                new LinkedBlockingDeque<>(100000),
                //默认线程工厂
                Executors.defaultThreadFactory(),
                //拒绝策略
                new ThreadPoolExecutor.AbortPolicy()
        );
    }
}
package com.saodai.saodaimall.order.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
/**
 *线程池核心配置(方便在application.properties中进行配置)
 **/
@ConfigurationProperties(prefix = "saodaimall.thread")
@Data
public class ThreadPoolConfigProperties {
    private Integer coreSize;  //线程池核心线程数量
    private Integer maxSize;   //线程池最大线程数量
    private Integer keepAliveTime;   //线程池(最大线程数量-核心线程数量)的存活时间
}

(2)在application.xml配置文件中配置线程池核心的配置项

# 线程池核心线程数量
saodaimall.thread.coreSize=20
#线程池最大线程数量
saodaimall.thread.maxSize=200
#线程池(最大线程数量-核心线程数量)的存活时间
saodaimall.thread.keepAliveTime=10

本商城项目哪里用到了线程池

订单服务

在订单服务的确认订单业务的第二步就使用了线程池来实现异步任务

常用线程池的操作

(1)线程池来实现异步任务runAsync+阻塞异步线程(记得都要加上阻塞异步线程)

@Autowired
private ThreadPoolExecutor threadPoolExecutor;  //线程池
CompletableFuture<Void> A = CompletableFuture.runAsync(() -> {
       //异步任务A
}, threadPoolExecutor);
CompletableFuture<Void> B = CompletableFuture.runAsync(() -> {
       //异步任务B
}, threadPoolExecutor);

(2)线程池异步任务runAsync+thenRunAsync+阻塞异步线程

这个跟上面的区别就是异步任务A执行后才会执行异步任务B,上面的异步任务A和异步任务B是同时执行的

CompletableFuture<Void> A = CompletableFuture.runAsync(() -> {
       //异步任务A
}, threadPoolExecutor).thenRunAsync(() -> {
       //异步任务B
},threadPoolExecutor);

(3)阻塞异步线程

1. //阻塞异步线程,只有两个异步都完成了才可以进行下一步
2. CompletableFuture.allOf(A,B).get(); //A,B是指上面的上个异步任务
目录
相关文章
|
4月前
|
存储 Java 调度
从零开始学习 Java:简单易懂的入门指南之线程池(三十六)
从零开始学习 Java:简单易懂的入门指南之线程池(三十六)
|
4月前
|
Java 调度
从零开始学习 Java:简单易懂的入门指南之多线程(三十四)
从零开始学习 Java:简单易懂的入门指南之多线程(三十四)
|
4月前
|
数据处理
多线程与并发编程【线程对象锁、死锁及解决方案、线程并发协作、生产者与消费者模式】(四)-全面详解(学习总结---从入门到深化)
多线程与并发编程【线程对象锁、死锁及解决方案、线程并发协作、生产者与消费者模式】(四)-全面详解(学习总结---从入门到深化)
58 1
|
4月前
|
设计模式 监控 安全
多线程设计模式【多线程上下文设计模式、Guarded Suspension 设计模式、 Latch 设计模式】(二)-全面详解(学习总结---从入门到深化)
多线程设计模式【多线程上下文设计模式、Guarded Suspension 设计模式、 Latch 设计模式】(二)-全面详解(学习总结---从入门到深化)
87 0
|
22天前
|
机器学习/深度学习 Java TensorFlow
深度学习中的图像识别:从理论到实践Java中的多线程编程入门指南
【8月更文挑战第29天】本文将深入探讨深度学习在图像识别领域的应用,从基础理论到实际应用案例,带领读者一步步理解如何利用深度学习技术进行图像识别。我们将通过一个简单的代码示例,展示如何使用Python和TensorFlow库实现一个基本的图像识别模型。无论你是初学者还是有一定经验的开发者,都能从中获得启发和学习。 【8月更文挑战第29天】在Java世界里,线程是程序执行的最小单元,而多线程则是提高程序效率和响应性的关键武器。本文将深入浅出地引导你理解Java多线程的核心概念、创建方法以及同步机制,帮助你解锁并发编程的大门。
|
3月前
|
Java 数据处理 调度
Java多线程编程入门指南
Java多线程编程入门指南
|
3月前
|
Java 开发者
告别单线程时代!Java 多线程入门:选继承 Thread 还是 Runnable?
【6月更文挑战第19天】在Java中,面对多任务需求时,开发者可以选择继承`Thread`或实现`Runnable`接口来创建线程。`Thread`继承直接但限制了单继承,而`Runnable`接口提供多实现的灵活性和资源共享。多线程能提升CPU利用率,适用于并发处理和提高响应速度,如在网络服务器中并发处理请求,增强程序性能。不论是选择哪种方式,都是迈向高效编程的重要一步。
33 2
|
3月前
|
监控 程序员 调度
协程实现单线程并发(入门)
协程实现单线程并发(入门)
38 1
|
2月前
|
Java 数据处理 调度
Java多线程编程入门指南
Java多线程编程入门指南
|
3月前
|
Java 开发者
JAVA多线程通信入门:wait()、notify()、notifyAll()大揭秘!
【6月更文挑战第20天】Java多线程中,`wait()`, `notify()`, `notifyAll()`是Object类的关键通信方法。`wait()`让线程等待并释放锁,`notify()`随机唤醒一个等待的线程,`notifyAll()`唤醒所有。示例展示了在共享资源类中如何使用它们来协调生产者消费者线程。调用前需持有锁,否则抛异常。注意避免死锁和活锁,恰当使用这些方法至关重要。
29 0