• Spring多线程


    Spring是通过TaskExecutor任务执行器来实现多线程和并发编程的。使用ThreadPoolTaskExecutor可实现一个基于线程池的TaskExecutor。而实际开发中任务一般是非阻碍的,即异步的,所以我们要在配置类中通过@EnableAsync开启对异步的支持,并通过在实际执行的Bean的方法中使用@Async注解来声明其是一个异步任务。


    实例代码:

    (1)配置类

    package com.lwh.highlight_spring4.ch3.taskexecutor;
    
    /**
     * Created by luwenhu on 2017/9/20.
     */
    
    import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.scheduling.annotation.AsyncConfigurer;
    import org.springframework.scheduling.annotation.EnableAsync;
    import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
    
    import java.util.concurrent.Executor;
    
    /**
     * Spring是通过TaskExecutor任务执行器来实现多线程和并发编程的。使用ThreadPoolTaskExecutor可实现一个基于线程池的TaskExecutor。
     * 而实际开发中任务一般是非阻碍的,即异步的,所以我们要在配置类中通过@EnableAsync开启对异步的支持,并通过在实际执行的Bean的方法中使用@Async注解来声明其是一个异步任务
     */
    @Configuration
    @ComponentScan("com.lwh.highlight_spring4.ch3.taskexecutor")
    @EnableAsync//开启异步任务支持
    public class TaskExecutorConfig implements AsyncConfigurer{
    
        /**
         * 实现AsyncConfigurer并重写getAsyncExecutor方法返回一个ThreadPoolTaskExecutor
         * @return
         */
        @Override
        public Executor getAsyncExecutor() {
            ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
            threadPoolTaskExecutor.setMaxPoolSize(10);
            threadPoolTaskExecutor.setCorePoolSize(5);
            threadPoolTaskExecutor.setQueueCapacity(25);
            threadPoolTaskExecutor.initialize();
            return threadPoolTaskExecutor;
        }
    
        @Override
        public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
            return null;
        }
    }

    (2)任务执行类

    package com.lwh.highlight_spring4.ch3.taskexecutor;
    
    import org.springframework.scheduling.annotation.Async;
    import org.springframework.stereotype.Service;
    
    /**
     * Created by luwenhu on 2017/9/20.
     */
    @Service
    public class AsyncTaskService {
    
        @Async//通过@Async注解表明该方法是个异步方法,如果注解在类级别,则表明该类所有的方法都是异步方法,而这里的方法自动被注入使用ThreadPoolTaskExecutor作为TaskExecutor
        public void executeAsyncTask(Integer i){
            System.out.println("执行异步任务:"+i);
        }
    
        @Async
        public void executeAsyncTaskPlus(Integer i){
            System.out.println("执行异步任务+1:"+(i+1));
        }
    }

    (3)运行类

    package com.lwh.highlight_spring4.ch3.taskexecutor;
    
    import org.springframework.context.annotation.AnnotationConfigApplicationContext;
    
    /**
     * Created by luwenhu on 2017/9/20.
     */
    public class Main {
        public static void main(String[] args){
            AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(TaskExecutorConfig.class);
    
            AsyncTaskService asyncTaskService = context.getBean(AsyncTaskService.class);
    
            for(int i=0;i<10;i++){
                asyncTaskService.executeAsyncTask(i);
                asyncTaskService.executeAsyncTaskPlus(i);
            }
            context.close();
        }
    }

    运行结果:

    
    
  • 相关阅读:
    Adobe Flash Builder 4.5 Android Air 程序开发系列 之六 多点触控
    Adobe Flash Builder 4.5 Android Air 程序开发系列 之九 定位
    Adobe Flash Builder 4.5 Android Air 程序开发系列 之七 重力感应
    Adobe Flash Builder 4.5 Android Air 程序开发系列 之五 保存数据的几种方式
    Adobe Flash Builder 4.5 Android Air 程序开发系列 之八 照相机
    Adobe Flash Builder 4.5 Android Air 程序开发系列 之三 Application 配置详解
    Adobe Flash Builder 4.5 Android Air 程序开发系列 之四 打开与关闭应用程序是的保存数据
    ADOBE FLASH BUILDER 4.6 IOS 开发之部署与调试
    [译] 高性能JavaScript 1至5章总结
    页签及盒子的web标准实现
  • 原文地址:https://www.cnblogs.com/wenhulu/p/spring.html
Copyright © 2020-2023  润新知