如何让spring管理匿名class的线程

How to make spring manage the thread of anonymous class

我明白,如果我按照以下步骤操作,我可以让 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() {...}});

是否springmanage/control同时线程数运行? 如何使它与使用@Component 和@Scope("prototype") 的线程一样工作? - 一种选择是将代码移动到不同的 class,但我们正在努力避免这种情况,因为我们有许多这样的小方法。

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

回答你的第二个问题 - 如果你正在使用 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 自己创建对象。