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地址:点击查看
    码云地址:点击查看

  • 相关阅读:
    尝试用Gearman实现分布式处理(PHP)
    如何在ubuntu上安装node.js
    Linux crontab定时执行任务 命令格式与详细例子
    MySQL的information_schema
    Ubuntu安装MongoDB
    Log4j日志管理系统简单使用说明
    android:screenOrientation横屏竖屏设置
    Android 自定义progressBar样式
    Java使用JDOM解析XML(转载,简单又详细)
    Caused by: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity
  • 原文地址:https://www.cnblogs.com/wangchaonan/p/10731522.html
Copyright © 2011-2022 走看看