我了解,如果我按照以下说明进行操作,则可以让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”)的线程相同? -一种选择是将代码移到另一个类,但是由于我们有许多小的此类方法,我们试图避免这种情况。
答案 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管理,因此自己创建对象。