网站主播,百度指数在哪里看,档案网站建设的原则,工信部icp备案官网目录
一.什么是线程池#xff1a;
二.使用线程池的好处#xff1a;
三.线程池的使用场景#xff1a;
四.使用线程池来提高Springboot项目的并发处理能力#xff1a;
1.在application.yml配置文件中配置#xff1a;
2.定义配置类来接受配置文件内的属性值#xff1a…目录
一.什么是线程池
二.使用线程池的好处
三.线程池的使用场景
四.使用线程池来提高Springboot项目的并发处理能力
1.在application.yml配置文件中配置
2.定义配置类来接受配置文件内的属性值
3.启用异步支持
4.实例 五.详细解析Async注解的使用
1.Async注解作用
2.Async注解的调用过程
3.Async注解使用
1启用异步支持 2定义异步方法
3调用异步方法
六.CompleteableFuture返回类型的使用
1.基本使用
1通过创建 CompleteableFuture 对象来创建异步任务
2获取异步方法的结果
2.链式编程
1thenApply()处理结果并返回新的值
2thenAccept()处理结果但不返回值
3thenRun()完成后执行另一个操作但不关心结果
3.组合多个异步任务进行处理
1thenCombine() – 组合两个独立任务的结果
2thenCompose() – 链式依赖
3allOf() – 等待多个任务全部完成
4anyOf() – 任意一个完成
4.异常处理
1exceptionally() – 捕获并处理异常
2handle() – 处理正常和异常情况
3whenComplete() – 完成后执行处理无论是否有异常
5.超时处理
1orTimeout() – 设置超时时间
2completeOnTimeout() – 超时后返回默认值
6.细节注意
1避免阻塞
2处理异常
3线程池优化 一.什么是线程池
线程池 是一种用于管理和控制多个工作线程的技术常用于处理并发任务。线程池的主要作用是避免在执行并发任务时频繁创建和销毁线程从而提升系统的性能和资源利用率。线程池会维护一定数量的线程当需要执行任务时会将任务交给线程池中的空闲线程去执行而不需要为每个任务创建新的线程。
二.使用线程池的好处 降低资源消耗通过复用已经创建的线程减少线程创建和销毁的开销尤其在高并发情况下这一点尤为明显。 提高响应速度线程池的线程可以在任务到来时立即执行任务而不必等待线程创建减少了响应时间。 提高线程管理的灵活性通过线程池开发者可以设置线程的数量、任务的队列方式以及线程的优先级和超时时间等从而更精细地管理并发任务。
三.线程池的使用场景
并发任务的执行线程池广泛应用于需要同时处理多个并发任务的场景例如 Web 服务器处理用户请求、数据处理等。定时任务通过 ScheduledThreadPoolExecutor 执行定时或周期性任务。资源受限的场景在线程数受限的场景中例如有固定的 CPU 核心数或数据库连接数线程池能够帮助限制同时执行的线程数避免资源的过载使用。
四.使用线程池来提高Springboot项目的并发处理能力
在 Spring Boot 项目中处理高并发时线程池可以帮助我们管理和优化线程的使用从而提高系统的并发处理能力。Spring Boot 提供了对线程池的内建支持我们可以通过配置和编程方式来使用线程池。
1.在application.yml配置文件中配置
在 application.yml 中虽然 Spring Boot 默认没有直接支持线程池配置的属性但你可以通过自定义配置类来实现线程池的配置。
spring:task:execution:pool:core-size: 10 #线程池的核心线程数max-size: 50 #线程池的最大线程数queue-capacity: 100 #线程池的任务队列容量keep-alive: 60s #线程池中非核心线程的空闲保持时间thread-name-prefix: Async- # 线程池中线程的名称前缀2.定义配置类来接受配置文件内的属性值
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.task.TaskExecutor;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;import java.util.concurrent.Executor;Configuration
public class TaskExecutorConfig {Value(${spring.task.execution.pool.core-size})private int corePoolSize;Value(${spring.task.execution.pool.max-size})private int maxPoolSize;Value(${spring.task.execution.pool.queue-capacity})private int queueCapacity;Value(${spring.task.execution.pool.keep-alive})private String keepAlive;Value(${spring.task.execution.pool.thread-name-prefix})private String threadNamePrefix;Bean(name taskExecutor)public Executor taskExecutor() {ThreadPoolTaskExecutor executor new ThreadPoolTaskExecutor();executor.setCorePoolSize(corePoolSize);executor.setMaxPoolSize(maxPoolSize);executor.setQueueCapacity(queueCapacity);executor.setKeepAliveSeconds(Integer.parseInt(keepAlive.replace(s, ))); // 将 60s 转换为 60executor.setThreadNamePrefix(threadNamePrefix);executor.initialize();return executor;}
}3.启用异步支持
为了确保 Spring Boot 应用程序启用了异步支持需要在主应用类或者配置类中添加 EnableAsync 注解
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;SpringBootApplication
EnableAsync
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}4.实例
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;Service
public class MyService {Async(taskExecutor)public void asyncMethod() {// 执行一些耗时操作,打印当前线程的名称System.out.println(Executing async method - Thread.currentThread().getName());}
}1.Async 注解用于将一个方法标记为异步执行。标记了 Async 的方法会在调用时由线程池中的线程异步执行而不是在调用线程中直接执行。 2.Async 注解的值 taskExecutor 表示使用名为 taskExecutor 的线程池来执行这个异步方法。这个线程池的配置需要在 Configuration 类中定义如前面所述。 五.详细解析Async注解的使用
Async 注解是 Spring 框架中用于实现异步任务执行的重要功能。它通过将任务放入线程池中执行从而解耦了任务的执行过程和调用过程极大地提升了系统的并发处理能力。下面我们来详细解析 Async 注解的工作原理、配置以及与线程池的结合使用。
1.Async注解作用
Async 用于将标注的方法异步执行意思是说这个方法的执行不会阻塞调用线程。相反Spring 会将该方法交给一个单独的线程来处理。这对于需要处理耗时任务的场景例如发送邮件、数据库查询、文件操作等非常有用能够提高系统响应能力和吞吐量。
2.Async注解的调用过程
当调用一个标注了 Async 的方法时调用者线程不会等待这个方法执行完成而是立即返回。实际上 Spring 会将 Async 方法提交到一个线程池中线程池中的线程负责实际执行该方法。标注 Async 的方法可以有返回值异步返回 Future 或 CompletableFuture也可以是 void 类型。如果不指定线程池Spring 默认使用 SimpleAsyncTaskExecutor。但在实际项目中通常需要自定义线程池来处理异步任务。
3.Async注解使用
1启用异步支持
首先需要在配置类或 Spring Boot 主类中启用异步支持 不加EnableAsync注解那么Async注解不会生效。 import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;SpringBootApplication
EnableAsync // 启用异步任务支持
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}2定义异步方法 在 Spring 的服务类中可以通过 Async 注解来定义异步方法。方法的返回类型可以是 void,FutureT,CompleteableFutureT所以我们需要用这三种来声明返回值类型。 import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;Service
public class MyAsyncService {Asyncpublic void asyncTask() {// 异步执行的任务System.out.println(Executing task in: Thread.currentThread().getName());}Asyncpublic CompletableFutureString asyncTaskWithReturn() {// 异步执行的任务并返回结果System.out.println(Executing task with return in: Thread.currentThread().getName());return CompletableFuture.completedFuture(Task Completed);}
}3调用异步方法
异步方法会在后台线程池中执行调用线程不会等待其执行结果
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;RestController
public class MyController {Autowiredprivate MyAsyncService myAsyncService;GetMapping(/async)public String testAsync() {// 调用异步方法myAsyncService.asyncTask();return Task started!;}GetMapping(/asyncReturn)public CompletableFutureString testAsyncWithReturn() {// 调用异步方法并获取返回结果return myAsyncService.asyncTaskWithReturn();}
}六.CompleteableFuture返回类型的使用 1.CompleteableFuture 是 Java 8 引入的一种用于异步编程的工具类它是 Future 的扩展提供了丰富的异步编程方法。CompleteableFuture 的强大之处在于其灵活性和丰富的 API可以轻松处理异步任务的组合、链式调用、异常处理等。 2.异步方法可以返回 CompleteableFuture以便调用方可以在合适的时机检查任务是否完成并获取任务的结果。 Async
public CompletableFutureString asyncMethodWithCompletableFuture() throws InterruptedException {Thread.sleep(1000); // 模拟耗时任务return CompletableFuture.completedFuture(Result from async task);
}1.基本使用
1通过创建 CompleteableFuture 对象来创建异步任务
// 手动创建一个未完成的CompletableFuture对象
CompletableFutureString future new CompletableFuture();// 使用supplyAsync创建异步任务
CompletableFutureString future1 CompletableFuture.supplyAsync(() - {return Hello, World!;
});// 使用runAsync创建没有返回值的异步任务
CompletableFutureVoid future2 CompletableFuture.runAsync(() - {System.out.println(Running a task asynchronously.);
});2获取异步方法的结果
CompletableFutureString future CompletableFuture.supplyAsync(() - Result);// get() 会阻塞当前线程直到结果可用
String result future.get();// getNow() 如果结果可用则立即返回否则返回默认值
String resultNow future.getNow(Default Value);// join() 类似于 get()但不会抛出受检异常
String resultJoin future.join();2.链式编程 CompletableFuture 允许你通过链式调用来构建一系列的异步任务常用的方法有 thenApply()、thenAccept() 和 thenRun()。 1thenApply()处理结果并返回新的值
CompletableFutureInteger future CompletableFuture.supplyAsync(() - 100).thenApply(result - result * 2); // 处理结果并返回新的值2thenAccept()处理结果但不返回值
CompletableFuture.supplyAsync(() - Hello).thenAccept(result - System.out.println(result)); // 打印结果3thenRun()完成后执行另一个操作但不关心结果
CompletableFuture.supplyAsync(() - Task).thenRun(() - System.out.println(Task completed!));3.组合多个异步任务进行处理 有时我们需要同时执行多个异步任务并在它们完成时进行进一步处理。CompletableFuture 提供了多个方法来组合任务例如 thenCombine()、thenCompose()、allOf() 和 anyOf()。 1thenCombine() – 组合两个独立任务的结果
CompletableFutureInteger future1 CompletableFuture.supplyAsync(() - 100);
CompletableFutureInteger future2 CompletableFuture.supplyAsync(() - 200);CompletableFutureInteger combinedFuture future1.thenCombine(future2, (result1, result2) - result1 result2);Integer combinedResult combinedFuture.join(); // 3002thenCompose() – 链式依赖
CompletableFutureString future CompletableFuture.supplyAsync(() - Hello).thenCompose(result - CompletableFuture.supplyAsync(() - result World));String combinedResult future.join(); // Hello World3allOf() – 等待多个任务全部完成
CompletableFutureVoid allFutures CompletableFuture.allOf(CompletableFuture.supplyAsync(() - Task 1),CompletableFuture.supplyAsync(() - Task 2),CompletableFuture.supplyAsync(() - Task 3)
);allFutures.join(); // 等待所有任务完成4anyOf() – 任意一个完成
CompletableFutureVoid allFutures CompletableFuture.allOf(CompletableFuture.supplyAsync(() - Task 1),CompletableFuture.supplyAsync(() - Task 2),CompletableFuture.supplyAsync(() - Task 3)
);allFutures.join(); // 等待所有任务完成4.异常处理 CompletableFuture 提供了几种方式来处理异常包括 exceptionally()、handle() 和 whenComplete()。 1exceptionally() – 捕获并处理异常
CompletableFutureInteger future CompletableFuture.supplyAsync(() - {if (Math.random() 0.5) {throw new RuntimeException(Something went wrong!);}return 100;
}).exceptionally(ex - {System.out.println(Caught exception: ex.getMessage());return -1; // 返回默认值
});Integer result future.join();2handle() – 处理正常和异常情况
CompletableFutureInteger future CompletableFuture.supplyAsync(() - {if (Math.random() 0.5) {throw new RuntimeException(Error occurred!);}return 100;
}).handle((result, ex) - {if (ex ! null) {System.out.println(Caught exception: ex.getMessage());return -1; // 返回默认值}return result * 2; // 处理结果
});Integer finalResult future.join();3whenComplete() – 完成后执行处理无论是否有异常
CompletableFutureInteger future CompletableFuture.supplyAsync(() - {if (Math.random() 0.5) {throw new RuntimeException(Error occurred!);}return 100;
}).whenComplete((result, ex) - {if (ex ! null) {System.out.println(Task completed with exception: ex.getMessage());} else {System.out.println(Task completed successfully with result: result);}
});5.超时处理 CompletableFuture 还支持在异步任务中设置超时以避免长时间等待。 1orTimeout() – 设置超时时间
CompletableFutureString future CompletableFuture.supplyAsync(() - {try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}return Completed;
}).orTimeout(1, TimeUnit.SECONDS); // 超时时间为1秒future.exceptionally(ex - {System.out.println(Task timed out);return Timeout;
});2completeOnTimeout() – 超时后返回默认值
CompletableFutureString future CompletableFuture.supplyAsync(() - {try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}return Completed;
}).completeOnTimeout(Default Value, 1, TimeUnit.SECONDS); // 超时返回默认值6.细节注意
1避免阻塞
尽量避免使用 get() 和 join() 直接阻塞主线程尽可能使用链式操作或回调来处理异步结果。
2处理异常
确保在异步操作中有良好的异常处理策略尤其是在组合多个任务时使用 exceptionally() 或 handle() 捕获和处理异常。
3线程池优化
默认的 CompletableFuture 使用 ForkJoinPool 来执行异步任务。对于高并发的场景你可以通过 supplyAsync() 或 runAsync() 的第二个参数传递自定义线程池来优化性能。 到这里线程池的相关内容想必你已经掌握了许多了看到这里了记得给个三连感谢观看 文章转载自: http://www.morning.qjxkx.cn.gov.cn.qjxkx.cn http://www.morning.yktr.cn.gov.cn.yktr.cn http://www.morning.rkbly.cn.gov.cn.rkbly.cn http://www.morning.mgkcz.cn.gov.cn.mgkcz.cn http://www.morning.tkchg.cn.gov.cn.tkchg.cn http://www.morning.fkmqg.cn.gov.cn.fkmqg.cn http://www.morning.gtmdq.cn.gov.cn.gtmdq.cn http://www.morning.xdlwm.cn.gov.cn.xdlwm.cn http://www.morning.mjyrg.cn.gov.cn.mjyrg.cn http://www.morning.huayaosteel.cn.gov.cn.huayaosteel.cn http://www.morning.rkkpr.cn.gov.cn.rkkpr.cn http://www.morning.tqpr.cn.gov.cn.tqpr.cn http://www.morning.sffkm.cn.gov.cn.sffkm.cn http://www.morning.pqhgn.cn.gov.cn.pqhgn.cn http://www.morning.mxmdd.cn.gov.cn.mxmdd.cn http://www.morning.jmdpp.cn.gov.cn.jmdpp.cn http://www.morning.nqyzg.cn.gov.cn.nqyzg.cn http://www.morning.fqqlq.cn.gov.cn.fqqlq.cn http://www.morning.khlxd.cn.gov.cn.khlxd.cn http://www.morning.qqrqb.cn.gov.cn.qqrqb.cn http://www.morning.nkwgy.cn.gov.cn.nkwgy.cn http://www.morning.rsbqq.cn.gov.cn.rsbqq.cn http://www.morning.lizpw.com.gov.cn.lizpw.com http://www.morning.qysnd.cn.gov.cn.qysnd.cn http://www.morning.dtzxf.cn.gov.cn.dtzxf.cn http://www.morning.wsxxq.cn.gov.cn.wsxxq.cn http://www.morning.ykqbs.cn.gov.cn.ykqbs.cn http://www.morning.gbfzy.cn.gov.cn.gbfzy.cn http://www.morning.ffbp.cn.gov.cn.ffbp.cn http://www.morning.ngmjn.cn.gov.cn.ngmjn.cn http://www.morning.tqwcm.cn.gov.cn.tqwcm.cn http://www.morning.wrlxt.cn.gov.cn.wrlxt.cn http://www.morning.jfsbs.cn.gov.cn.jfsbs.cn http://www.morning.jjzrh.cn.gov.cn.jjzrh.cn http://www.morning.qftzk.cn.gov.cn.qftzk.cn http://www.morning.jprrh.cn.gov.cn.jprrh.cn http://www.morning.youyouling.cn.gov.cn.youyouling.cn http://www.morning.tcxzn.cn.gov.cn.tcxzn.cn http://www.morning.gbpanel.com.gov.cn.gbpanel.com http://www.morning.gccrn.cn.gov.cn.gccrn.cn http://www.morning.ubpsa.cn.gov.cn.ubpsa.cn http://www.morning.gwtbn.cn.gov.cn.gwtbn.cn http://www.morning.dywgl.cn.gov.cn.dywgl.cn http://www.morning.msgcj.cn.gov.cn.msgcj.cn http://www.morning.kxsnp.cn.gov.cn.kxsnp.cn http://www.morning.pqhfx.cn.gov.cn.pqhfx.cn http://www.morning.ccphj.cn.gov.cn.ccphj.cn http://www.morning.kqwsy.cn.gov.cn.kqwsy.cn http://www.morning.ltqtp.cn.gov.cn.ltqtp.cn http://www.morning.addai.cn.gov.cn.addai.cn http://www.morning.pxbrg.cn.gov.cn.pxbrg.cn http://www.morning.byxs.cn.gov.cn.byxs.cn http://www.morning.tfrmx.cn.gov.cn.tfrmx.cn http://www.morning.ynwdk.cn.gov.cn.ynwdk.cn http://www.morning.nftzn.cn.gov.cn.nftzn.cn http://www.morning.gnfkl.cn.gov.cn.gnfkl.cn http://www.morning.wlgpz.cn.gov.cn.wlgpz.cn http://www.morning.gbrps.cn.gov.cn.gbrps.cn http://www.morning.cjqqj.cn.gov.cn.cjqqj.cn http://www.morning.zyrp.cn.gov.cn.zyrp.cn http://www.morning.qrcsb.cn.gov.cn.qrcsb.cn http://www.morning.zlsmx.cn.gov.cn.zlsmx.cn http://www.morning.rcww.cn.gov.cn.rcww.cn http://www.morning.kpbgvaf.cn.gov.cn.kpbgvaf.cn http://www.morning.crtgd.cn.gov.cn.crtgd.cn http://www.morning.lywys.cn.gov.cn.lywys.cn http://www.morning.lhrcr.cn.gov.cn.lhrcr.cn http://www.morning.mtrfz.cn.gov.cn.mtrfz.cn http://www.morning.xgbq.cn.gov.cn.xgbq.cn http://www.morning.hxgly.cn.gov.cn.hxgly.cn http://www.morning.ggjlm.cn.gov.cn.ggjlm.cn http://www.morning.nqpy.cn.gov.cn.nqpy.cn http://www.morning.ypcd.cn.gov.cn.ypcd.cn http://www.morning.gzzxlp.com.gov.cn.gzzxlp.com http://www.morning.yrlfy.cn.gov.cn.yrlfy.cn http://www.morning.xsqbx.cn.gov.cn.xsqbx.cn http://www.morning.pnntx.cn.gov.cn.pnntx.cn http://www.morning.qlsbz.cn.gov.cn.qlsbz.cn http://www.morning.hmmnb.cn.gov.cn.hmmnb.cn http://www.morning.dnphd.cn.gov.cn.dnphd.cn