首页 > 解决方案 > 如何让spring管理匿名类的线程

问题描述

我知道如果我遵循我可以让 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") 的线程一样工作?- 一种选择是将代码移动到不同的类,但我们正试图避免这种情况,因为我们有许多这样的小方法。

标签: springmultithreadingthreadpoolthreadpoolexecutor

解决方案


回答您的第一个问题-第一个和第二个之间没有区别,在这两种情况下,线程池管理都将由 Spring 处理,因为您正在调用executeSpring 上的方法ThreadPoolTaskExecutor,如果您正在调用它,java.util.concurrent.ThreadPoolExecutor则线程池管理将不会由 Spring 处理春天。

回答您的第二个问题- 如果您使用的是 Spring,ThreadPoolTaskExecutor那么线程池管理将由 Spring 处理。您阅读了有关核心池大小、最大池大小和队列容量的信息,以了解如何控制同时运行的线程数。

总的来说,我认为您对 Spring 本质上是一个 IOC 容器和 Spring 提供ThreadPoolTaskExecutor线程池管理(只不过是 Spring 的 Java 版本java.util.concurrent.ThreadPoolExecutor)这一事实感到困惑。

以这种方式理解:当你这样做时,taskExecutor.execute(aTask1);线程池管理将由 Spring 处理,因为你使用的是 Spring 的ThreadPoolTaskExecutor,ALSO bean 管理将由 Spring 处理,因为aTask1它是 Spring bean 的对象。当您这样做时,taskExecutor.execute(new ATask("A task 1"));线程池管理将由 Spring 处理,因为您使用的是 Spring 的ThreadPoolTaskExecutor,但是这次 bean 管理将不会由 Spring 完成,因为您正在使用new自己创建对象。


推荐阅读