如何使Spring管理匿名类的线程

时间:2018-09-21 06:27:49

标签: spring multithreading threadpool threadpoolexecutor

我了解,如果我按照以下说明进行操作,则可以让Spring管理线程

@Component
@Scope("prototype")
public class ATask implements Runnable{....}
ThreadPoolTaskExecutor taskExecutor = (ThreadPoolTaskExecutor) context.getBean("taskExecutor");
ATask aTask1 = (ATask) ctx.getBean("aTask");
taskExecutor.execute(aTask1);

我不明白的是

有什么区别
taskExecutor.execute(aTask1);

taskExecutor.execute(new ATask("A task 1"));

我的猜测是第二种情况,线程的创建不是由spring通过执行来管理的。

第二个问题, 对于以下代码,

this.taskExecutor.execute(new Runnable() {
       @Override
       public void run() {...}});

spring是否管理/控制同时运行的线程数? 如何使其与使用@Component和@Scope(“ prototype”)的线程相同? -一种选择是将代码移到另一个类,但是由于我们有许多小的此类方法,我们试图避免这种情况。

1 个答案:

答案 0 :(得分:0)

第一个问题的答案-第一个问题和第二个问题没有区别,在这两种情况下,Spring都将处理线程池管理,因为您正在Spring的{上调用execute方法{1}},如果您在ThreadPoolTaskExecutor上调用它,那么Spring将不会处理线程池管理。

第二个问题的答案-如果您使用的是Spring的java.util.concurrent.ThreadPoolExecutor,则线程池管理将由Spring处理。您将了解核心池大小,最大池大小和队列容量,以了解如何控制同时运行的线程数。

总体我认为您对于Spring从根本上来说是一个IOC容器和Spring提供ThreadPoolTaskExecutor来进行线程池管理(这只是Spring的Java {{1的版本) }})。

这种理解方式::当您执行ThreadPoolTaskExecutor时,Spring将处理线程池管理,因为您使用的是Spring的java.util.concurrent.ThreadPoolExecutor,ALSO bean管理将由Spring,因为taskExecutor.execute(aTask1);是Spring bean的对象。并且当您执行ThreadPoolTaskExecutor时,Spring将处理线程池管理,因为您正在使用Spring的aTask1,但是这次,由于您正在使用taskExecutor.execute(new ATask("A task 1"));来进行Spring的bean管理,因此自己创建对象。