使用SPRING中的线程池ThreadPoolTaskExecutor实现并发。
一:不需要返回值的情况
1,初始化线程池
- ThreadPoolTaskExecutor poolTaskExecutor = new ThreadPoolTaskExecutor();
- poolTaskExecutor.setQueueCapacity(10000);
- poolTaskExecutor.setCorePoolSize(5);
- poolTaskExecutor.setMaxPoolSize(10);
- poolTaskExecutor.setKeepAliveSeconds(5000);
- poolTaskExecutor.initialize();
ThreadPoolTaskExecutor poolTaskExecutor = new ThreadPoolTaskExecutor(); poolTaskExecutor.setQueueCapacity(10000); poolTaskExecutor.setCorePoolSize(5); poolTaskExecutor.setMaxPoolSize(10); poolTaskExecutor.setKeepAliveSeconds(5000); poolTaskExecutor.initialize();
2,在线程池中执行某个线程
- poolTaskExecutor.execute(new Thread(Objct...){...});
poolTaskExecutor.execute(new Thread(Objct...){...});
二:需要返回值的情况
1,初始化线程池poolTaskExecutor,同上
2,新建一个类,实现Callable接口
- class GetFromDB implements Callable<User> {
- private UserDao userDao;
- private Long userId;
- public GetFromDB(UserDao userDao, Long userId) {
- this.userDao = userDao;
- this.userId = userId;
- }
- public User call() throws DaoException {
- User user = userDao.getUserById(userId);
- return user;
- }
- }
class GetFromDB implements Callable<User> { private UserDao userDao; private Long userId; public GetFromDB(UserDao userDao, Long userId) { this.userDao = userDao; this.userId = userId; } public User call() throws DaoException { User user = userDao.getUserById(userId); return user; } }
3,用之前的GetFromDB类构造一个FutureTask类
- FutureTask<User> dbtask = new FutureTask<User>(GetFromDB);
FutureTask<User> dbtask = new FutureTask<User>(GetFromDB);
4,提交并执行
- threadpool.submit(dbtask);
threadpool.submit(dbtask);
5,得到返回值
- try {
- User user = dbtask.get();
- } catch (Exception e) {
- if (e instanceof ExecutionException
- && ((ExecutionException) e).getCause() instanceof DaoException) {
- throw (DaoException) ((ExecutionException) e).getCause();
- } else {
- 其他处理方式
- }
- }
try { User user = dbtask.get(); } catch (Exception e) { if (e instanceof ExecutionException && ((ExecutionException) e).getCause() instanceof DaoException) { throw (DaoException) ((ExecutionException) e).getCause(); } else { 其他处理方式 } }
注:一旦调用了get()方法,如果线程还未产生返回值,则将阻塞get()方法,直到得到返回值。基于此,如果你想确保线程执行完后才执行下一步操作,即使你不想得到返回值也可以调用一下此方法。当然这与多线程的初衷不符。
相关推荐
在这个主题中,我们将深入探讨如何利用Spring MVC与Spring线程池来有效地管理并发请求,并解决数据同步控制问题。 一、Spring MVC与并发处理 1. Spring MVC通过DispatcherServlet接收HTTP请求,然后根据映射规则将...
在Spring框架中,线程池的使用是实现并发和异步任务执行的关键工具。线程池的概念源于Java的`java.util.concurrent.ExecutorService`接口,它允许我们管理一组可重用的工作线程,以提高系统效率并减少资源消耗。...
配置Spring线程池主要涉及以下几个核心属性: 1. `corePoolSize`:核心线程数,即线程池维护线程的最少数量。即使在空闲时,线程池也会保留这些线程,不进行销毁。 2. `maximumPoolSize`:最大线程数,线程池能容纳...
标题中的“Spring线程池”指的是Spring框架中提供的线程池实现,它是Spring对Java的ExecutorService接口的一个封装,提供了更高级别的抽象和扩展性。线程池在多线程编程中扮演着至关重要的角色,它能有效地管理和...
然后,我们可以在服务接口的实现类中使用 @Async 注解来异步地执行工作。例如: ```java @Service public class AsyncServiceImpl implements AsyncService { @Async public void useAsyncThreadWork() { // ...
总之,`ThreadPoolTaskExecutor`是Spring中实现线程池的重要工具,它可以有效地管理并发任务,提高系统性能。结合`FutureTask`,我们可以方便地执行异步任务并获取结果,这对于处理大量并发请求的系统来说非常有用。...
标题 "HttpClient + Spring 实现多线程" 涉及到的是如何在Spring框架中使用Apache HttpClient库来创建一个支持多线程的HTTP客户端服务。Apache HttpClient是一个强大的HTTP客户端API,它提供了丰富的功能来处理HTTP...
在Spring Boot应用中,使用线程池和异步处理是提高系统并发性能和响应速度的重要手段。`@Async`注解是Spring提供的一个特性,用于标记方法为异步执行,这样可以避免主线程等待耗时的操作,提高系统效率。本文将详细...
Java线程池是Java并发编程中的重要组成部分,它在多线程编程中扮演着至关重要的角色,有效地管理和调度线程资源,提高了程序的性能和稳定性。本文将深入探讨Java线程池的概念、工作原理以及如何在实际开发中运用。 ...
### Spring3.2.6定时任务...#### 二、Spring线程池配置 Spring框架提供了一个强大的任务调度模块,其中包含了对线程池的支持。下面通过一个具体的示例来展示如何在Spring3.2.6中配置线程池: ```xml <!-- 线程池 --> ...
本文将详细探讨在Spring框架中如何配置和使用线程池,并通过一个简单的示例——"Spring线程池demo"来展示其实现过程。 首先,我们需要了解线程池的基本原理。线程池通过预先创建一定数量的线程,当有任务需要执行时...
当我们谈到在Spring中实现多线程,实际上是在讨论如何在Spring环境中创建、管理和协调并发执行的任务。这涉及到Java的并发API以及Spring对这些API的包装和扩展。 首先,让我们了解Java中的多线程基础。在Java中,...
在本文中,我们学习了如何使用@Async注解来实现异步调用,并且了解了如何使用ThreadPoolTaskExecutor类来创建一个自定义的线程池。通过使用自定义的线程池,我们可以更好地控制异步调用的并发性,从而提高应用程序的...
在高并发场景下,可以利用线程池来管理请求,例如通过ThreadPoolTaskExecutor配置一个合适的线程池大小,以提高系统处理能力并避免过度消耗资源。 接着,数据库部分,项目中提到了使用SQLServer,但同时表明MySQL也...
Spring框架在2.0版本之后引入了对线程池的支持,主要是受到了Java SE 5.0中`java.util.concurrent.Executor`接口的影响。`TaskExecutor`接口是Spring为各种线程池服务提供的一种抽象,它的目的是统一客户端的视图,...
在添加了线程池Executor的配置后,我们可以在Controller或Service类中使用@Resource注解来注入线程池Executor,以便在业务逻辑中使用线程池进行并发操作。例如: ```java @Controller public class IndexController ...
Spring框架还提供了其他的线程池和定时任务执行的实现类,例如ApplicationEventMulticaster、Quartz等,这些实现类都使用TaskExecutor和TaskScheduler作为抽象接口来屏蔽掉底层JDK版本间以及Java EE中的线程池和定时...
在Spring Boot应用中,我们经常需要处理大量的并发请求,这时自定义异步线程池就显得尤为重要。异步处理能够提高应用的响应速度,避免主线程阻塞,从而提升系统性能。本文将详细介绍两种在Spring Boot中实现自定义...
在实际应用中,我们可能还需要关注线程池的监控和调优,例如通过JMX或Spring的`ThreadPoolTaskExecutor`进行监控,以及根据系统负载动态调整线程池参数。 至于提到的"工具"标签,可能指的是使用一些工具库如Apache ...
这使得我们可以使用Java并发库中的其他执行器,如`ScheduledThreadPoolExecutor`来实现定时任务或者周期性任务。 另外,`ThreadPoolTaskScheduler`是Spring提供的一个调度任务执行器,它可以用来执行定时任务。配置...