`

使用SPRING中的线程池ThreadPoolTaskExecutor实现JAVA并发

 
阅读更多

使用SPRING中的线程池ThreadPoolTaskExecutor实现并发。


一:不需要返回值的情况
1,初始化线程池

Java代码 复制代码 收藏代码
  1. ThreadPoolTaskExecutor poolTaskExecutor = new ThreadPoolTaskExecutor();
  2. poolTaskExecutor.setQueueCapacity(10000);
  3. poolTaskExecutor.setCorePoolSize(5);
  4. poolTaskExecutor.setMaxPoolSize(10);
  5. poolTaskExecutor.setKeepAliveSeconds(5000);
  6. poolTaskExecutor.initialize();
ThreadPoolTaskExecutor poolTaskExecutor = new ThreadPoolTaskExecutor();
poolTaskExecutor.setQueueCapacity(10000);
poolTaskExecutor.setCorePoolSize(5);
poolTaskExecutor.setMaxPoolSize(10);
poolTaskExecutor.setKeepAliveSeconds(5000);
poolTaskExecutor.initialize();

 

2,在线程池中执行某个线程

Java代码 复制代码 收藏代码
  1. poolTaskExecutor.execute(new Thread(Objct...){...});
poolTaskExecutor.execute(new Thread(Objct...){...});

 

二:需要返回值的情况
1,初始化线程池poolTaskExecutor,同上

 

2,新建一个类,实现Callable接口

Java代码 复制代码 收藏代码
  1. class GetFromDB implements Callable<User> {
  2. private UserDao userDao;
  3. private Long userId;
  4. public GetFromDB(UserDao userDao, Long userId) {
  5. this.userDao = userDao;
  6. this.userId = userId;
  7. }
  8. public User call() throws DaoException {
  9. User user = userDao.getUserById(userId);
  10. return user;
  11. }
  12. }
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类

Java代码 复制代码 收藏代码
  1. FutureTask<User> dbtask = new FutureTask<User>(GetFromDB);
FutureTask<User> dbtask = new FutureTask<User>(GetFromDB);

 

4,提交并执行

Java代码 复制代码 收藏代码
  1. threadpool.submit(dbtask);
threadpool.submit(dbtask);

 

5,得到返回值

Java代码 复制代码 收藏代码
  1. try {
  2. User user = dbtask.get();
  3. } catch (Exception e) {
  4. if (e instanceof ExecutionException
  5. && ((ExecutionException) e).getCause() instanceof DaoException) {
  6. throw (DaoException) ((ExecutionException) e).getCause();
  7. } else {
  8. 其他处理方式
  9. }
  10. }
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()方法,直到得到返回值。基于此,如果你想确保线程执行完后才执行下一步操作,即使你不想得到返回值也可以调用一下此方法。当然这与多线程的初衷不符。

 

 

 

 

分享到:
评论

相关推荐

    springmvc+spring线程池处理http并发请求数据同步控制问题

    在这个主题中,我们将深入探讨如何利用Spring MVC与Spring线程池来有效地管理并发请求,并解决数据同步控制问题。 一、Spring MVC与并发处理 1. Spring MVC通过DispatcherServlet接收HTTP请求,然后根据映射规则将...

    spring线程池(同步、异步).docx

    在Spring框架中,线程池的使用是实现并发和异步任务执行的关键工具。线程池的概念源于Java的`java.util.concurrent.ExecutorService`接口,它允许我们管理一组可重用的工作线程,以提高系统效率并减少资源消耗。...

    spring 线程池实例

    配置Spring线程池主要涉及以下几个核心属性: 1. `corePoolSize`:核心线程数,即线程池维护线程的最少数量。即使在空闲时,线程池也会保留这些线程,不进行销毁。 2. `maximumPoolSize`:最大线程数,线程池能容纳...

    spring 线程池

    标题中的“Spring线程池”指的是Spring框架中提供的线程池实现,它是Spring对Java的ExecutorService接口的一个封装,提供了更高级别的抽象和扩展性。线程池在多线程编程中扮演着至关重要的角色,它能有效地管理和...

    Spring Boot使用Spring的异步线程池的实现

    然后,我们可以在服务接口的实现类中使用 @Async 注解来异步地执行工作。例如: ```java @Service public class AsyncServiceImpl implements AsyncService { @Async public void useAsyncThreadWork() { // ...

    spring线程池ThreadPoolExecutor配置以及FutureTask的使用

    总之,`ThreadPoolTaskExecutor`是Spring中实现线程池的重要工具,它可以有效地管理并发任务,提高系统性能。结合`FutureTask`,我们可以方便地执行异步任务并获取结果,这对于处理大量并发请求的系统来说非常有用。...

    HttpClient+ Spring实现多线程

    标题 "HttpClient + Spring 实现多线程" 涉及到的是如何在Spring框架中使用Apache HttpClient库来创建一个支持多线程的HTTP客户端服务。Apache HttpClient是一个强大的HTTP客户端API,它提供了丰富的功能来处理HTTP...

    Spring Boot 线程池的创建、@Async 配置步骤及注意事项.docx

    在Spring Boot应用中,使用线程池和异步处理是提高系统并发性能和响应速度的重要手段。`@Async`注解是Spring提供的一个特性,用于标记方法为异步执行,这样可以避免主线程等待耗时的操作,提高系统效率。本文将详细...

    Java线程池介绍Java开发Java经验技巧共8页.pd

    Java线程池是Java并发编程中的重要组成部分,它在多线程编程中扮演着至关重要的角色,有效地管理和调度线程资源,提高了程序的性能和稳定性。本文将深入探讨Java线程池的概念、工作原理以及如何在实际开发中运用。 ...

    Spring3.2.6定时任务+线程池.docx

    ### Spring3.2.6定时任务...#### 二、Spring线程池配置 Spring框架提供了一个强大的任务调度模块,其中包含了对线程池的支持。下面通过一个具体的示例来展示如何在Spring3.2.6中配置线程池: ```xml &lt;!-- 线程池 --&gt; ...

    Spring线程池demo

    本文将详细探讨在Spring框架中如何配置和使用线程池,并通过一个简单的示例——"Spring线程池demo"来展示其实现过程。 首先,我们需要了解线程池的基本原理。线程池通过预先创建一定数量的线程,当有任务需要执行时...

    java中spring里实现多线程

    当我们谈到在Spring中实现多线程,实际上是在讨论如何在Spring环境中创建、管理和协调并发执行的任务。这涉及到Java的并发API以及Spring对这些API的包装和扩展。 首先,让我们了解Java中的多线程基础。在Java中,...

    Spring Boot利用@Async如何实现异步调用:自定义线程池

    在本文中,我们学习了如何使用@Async注解来实现异步调用,并且了解了如何使用ThreadPoolTaskExecutor类来创建一个自定义的线程池。通过使用自定义的线程池,我们可以更好地控制异步调用的并发性,从而提高应用程序的...

    java统计高并发首页访问量,记录客户登录信息

    在高并发场景下,可以利用线程池来管理请求,例如通过ThreadPoolTaskExecutor配置一个合适的线程池大小,以提高系统处理能力并避免过度消耗资源。 接着,数据库部分,项目中提到了使用SQLServer,但同时表明MySQL也...

    Spring提供的线程池支持[借鉴].pdf

    Spring框架在2.0版本之后引入了对线程池的支持,主要是受到了Java SE 5.0中`java.util.concurrent.Executor`接口的影响。`TaskExecutor`接口是Spring为各种线程池服务提供的一种抽象,它的目的是统一客户端的视图,...

    springmvc配置线程池Executor做多线程并发操作的代码实例

    在添加了线程池Executor的配置后,我们可以在Controller或Service类中使用@Resource注解来注入线程池Executor,以便在业务逻辑中使用线程池进行并发操作。例如: ```java @Controller public class IndexController ...

    基于Spring中的线程池和定时任务功能解析

    Spring框架还提供了其他的线程池和定时任务执行的实现类,例如ApplicationEventMulticaster、Quartz等,这些实现类都使用TaskExecutor和TaskScheduler作为抽象接口来屏蔽掉底层JDK版本间以及Java EE中的线程池和定时...

    Spring Boot 自定义异步线程池的两种方式Demo

    在Spring Boot应用中,我们经常需要处理大量的并发请求,这时自定义异步线程池就显得尤为重要。异步处理能够提高应用的响应速度,避免主线程阻塞,从而提升系统性能。本文将详细介绍两种在Spring Boot中实现自定义...

    使用线程池ThreadPoolExecutor 抓取论坛帖子列表

    在实际应用中,我们可能还需要关注线程池的监控和调优,例如通过JMX或Spring的`ThreadPoolTaskExecutor`进行监控,以及根据系统负载动态调整线程池参数。 至于提到的"工具"标签,可能指的是使用一些工具库如Apache ...

    Java Spring多线程demo代码

    这使得我们可以使用Java并发库中的其他执行器,如`ScheduledThreadPoolExecutor`来实现定时任务或者周期性任务。 另外,`ThreadPoolTaskScheduler`是Spring提供的一个调度任务执行器,它可以用来执行定时任务。配置...

Global site tag (gtag.js) - Google Analytics