zoukankan      html  css  js  c++  java
  • spring多线程

    Spring4.x高级话题(二):多线程

    . 点睛

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

    . 示例

    1. 配置类

    package org.light4j.sping4.senior.taskExecutor;

     

    import java.util.concurrent.Executor;

     

    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;

    @Configuration

    @ComponentScan("org.light4j.sping4.senior.taskExecutor")

    @EnableAsync //①

    public class TaskExecutorConfig implements AsyncConfigurer{//②

     

        @Override

        public Executor getAsyncExecutor() {//②

            ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();

                taskExecutor.setCorePoolSize(5);

                taskExecutor.setMaxPoolSize(10);

                taskExecutor.setQueueCapacity(25);

                taskExecutor.initialize();

                return taskExecutor;

        }

     

        @Override

        public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {

            return null;

        }

     

    }

    代码解释:

    ① 利用@EnableAsync注解开启异步任务支持。
    ② 配置类实现AsyncConfigurer接口并重写getAsyncExecutor方法,并返回ThreadPoolTaskExecutor ,这样就获得了一个基于线程池的TaskExecutor。

    2. 任务执行类

    package org.light4j.sping4.senior.taskExecutor;

     

    import org.springframework.scheduling.annotation.Async;

    import org.springframework.stereotype.Service;

    @Service

    public class AsyncTaskService {

     

        @Async //①

        public void executeAsyncTask(Integer i){

            System.out.println("执行异步任务: "+i);

        }

     

        @Async

        public void executeAsyncTaskPlus(Integer i){

            System.out.println("执行异步任务+1: "+(i+1));

        }

    }

    代码解释:

    ① 通过@Async注解表明该方法是个异步方法,如果注解在类级别,则表明该类所有的方法都是异步方法,而这里的方法自动被注入使用ThreadPoolTaskExecutor作为TaskExecutor。

    3. 运行

    package org.light4j.sping4.senior.taskExecutor;

     

    import org.springframework.context.annotation.AnnotationConfigApplicationContext;

     

    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();

        }

    }

    输出结果表明是并发执行而不是顺序执行的,
    运行结果如下图所示:

    4. 源代码示例:

    github地址:点击查看
    码云地址:点击查看

  • 相关阅读:
    XML 学习(二)
    maven运用,在eclipse中将maven本地仓库加入,创建maven项目
    windows提权
    windows文件权限问题
    更换tomcat版本遇到问题解决方法
    服务器安装vmware遇到的问题
    windows远程账户禁用/允许/隐藏
    使用maven下载jar包
    编写WebService 并发布到IIS中
    一些有趣的javascript小测试
  • 原文地址:https://www.cnblogs.com/wangchaonan/p/10731522.html
Copyright © 2011-2022 走看看