spring - 如何让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") 的线程一样工作?- 一种选择是将代码移动到不同的类,但我们正试图避免这种情况,因为我们有许多这样的小方法。
解决方案
回答您的第一个问题-第一个和第二个之间没有区别,在这两种情况下,线程池管理都将由 Spring 处理,因为您正在调用execute
Spring 上的方法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
自己创建对象。
推荐阅读
- c# - 如果属性不等于该值的简写,则为其赋值
- c++ - 将类指针作为函数参数传递
- php - 使用 Maatwebsite / Laravel-Excel 的 excel 下拉菜单
- laravel - 编辑时将数据库中的十进制值转换为输入值中的自动数字
- reactjs - 带有标记和信息窗口的谷歌地图
- python - PyDrive:如何使用此帐户的默认设置创建文件?
- c# - Azure Pipeline - 构建中缺少一个 csproj
- python-3.x - celery beat - 如何为用户列表运行多个任务?
- dialogflow-cx - 是否可以检索数组中的字段值并将其放入按钮中?我目前正在做一个像聊天机器人这样的测验
- javascript - 这两个函数'foo1'和'foo2'有什么区别?