多线程在Spring中的使用

简介: 多线程在Spring中的使用

案例1:自定义多播器和多线程有什么关系?


自定义多播器


自定义多播器如下所示,其实和我们自定义其他的不太一样,因为其他的自定义不会有value值,为什么此处必须要有value = "applicationEventMulticaster"???


@Component(value = "applicationEventMulticaster")
public class Myulticaster extends SimpleApplicationEventMulticaster{
    public MyMulticaster () {
        setTaskExecutor(Executors.newSingleThreadExecutor());
    }
}


答案在源码中


AbstractApplicationContext的initApplicationEventMulticaster()方法用于初始化Multicaster,Spring已经把多播器的名字写在源码中


public static final String APPLICATION_EVENT_MULTICASTER_BEAN_NAME = "applicationEventMulticaster";
protected void initApplicationEventMulticaster() {
    ConfigurableListableBeanFactory beanFactory = getBeanFactory();
        //如果beanFactory中有applicationEventMulticaster的bean,就把该Bean赋值给this.applicationEventMulticaster
    if (beanFactory.containsLocalBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME)) {
      this.applicationEventMulticaster =
          beanFactory.getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class);
      }
    }
    else {
            //否则就创建一个SimpleApplicationEventMulticaster
      this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);
      beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster);
    }
  }


案例


下面是自定义的listener


@Component
public class MyApplicationListener implements ApplicationListener<ApplicationEvent> {
    @Override
    public void onApplicationEvent(ApplicationEvent event) {
    System.out.println("-----------MyApplicationListener-------------");
    try { TimeUnit.SECONDS.sleep(3); } catch (Exception e) { e.printStackTrace(); } finally { }
        System.out.println("-----------MyApplicationListener over-------------");
    }
}


当不不自定义多播器的时候,上面listener是同步执行的,如果定义了多波器,是异步执行的。


源码


https://github.com/cbeann/Demooo/blob/master/spring-demo/src/main/java/ioc/AppMyulticasterDemo.java


案例2:异步@Async


@Service
public class EmailService {
  @Async
  public void sendEmail() {
    System.out.println("---start--");
    try {
      TimeUnit.SECONDS.sleep(5);
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
    }
    System.out.println("---end--");
  }
}


调用EmailService.sendEmail()的时候是异步,也是用了线程池


源码


https://github.com/cbeann/Demooo/blob/master/springboot-demo/src/main/java/com/example/theadpool/App.java


目录
相关文章
|
1天前
|
Java 关系型数据库 数据库连接
BATJ高频面试249道题:微服务+多线程+分布式+MyBatis +Spring
本文收集整理了各大厂常见面试题N道,你想要的这里都有内容涵盖:Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、Redis、MySQL、Spring、Spring Boot、Spring Cloud、RabbitMQ、Kafka、Linux 等技术栈,希望大家都能找到适合自己的公司,开开心心的撸代码。
|
1天前
|
JavaScript Java API
spring boot使用异步多线程
一文讲清楚spring boot如何结合异步多线程实现文件的导出这类耗时间的操作优化以及常用的场景,了解异步思想
42 0
spring boot使用异步多线程
|
1天前
|
安全 Java 调度
Spring中的多线程魔法:探索@Async注解的妙用
Spring中的多线程魔法:探索@Async注解的妙用
43 0
|
6月前
|
XML Java 数据库
Spring在多线程环境下如何确保事务的一致性?
Spring在多线程环境下如何确保事务的一致性?
213 1
|
6月前
|
Java Spring
Spring在多线程中bean的注入问题
Spring在多线程中bean的注入问题
|
消息中间件 编解码 JavaScript
Spring 多线程异步上传图片、处理水印、缩略图
Spring 多线程异步上传图片、处理水印、缩略图
|
11月前
|
XML IDE Java
JAVA多线程以及Spring异步注解@Async
JAVA多线程以及Spring异步注解@Async
421 1
|
12月前
|
监控 安全 Java
Spring JDBC-事务管理中的多线程问题
Spring JDBC-事务管理中的多线程问题
157 0
|
前端开发 Java Spring
Java Spring 定时任务配置调试多线程和执行多线程
遇到同一台服务器的定时任务部分执行的情况,暂时找不到原因,估计是因为线程被占满了,有些任务无法执行。 因项目用的是spring mvc的,这里暂时记录spring mvc配置,回头将spring boot的配置详细说明也加上。
238 0
|
前端开发 Java Spring
spring 的 controller 是单例模式,但是是多线程,各个线程之间不影响
spring 的 controller 是单例模式,但是是多线程,各个线程之间不影响
174 0