如何让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
自己创建对象。
我明白,如果我按照以下步骤操作,我可以让 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
自己创建对象。