代码之家  ›  专栏  ›  技术社区  ›  Akshay

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

  •  0
  • Akshay  · 技术社区  · 6 年前

    @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”)的线程工作相同一种选择是将代码移到另一个类中,但我们正试图避免这种情况,因为我们有许多这样的小方法。

    1 回复  |  直到 6 年前
        1
  •  0
  •   hagrawal7777    6 年前

    -第一个和第二个线程池之间没有区别,在这两种情况下,线程池管理都将由Spring负责,因为您正在调用 execute 弹簧的方法 ThreadPoolTaskExecutor ,如果你正在打电话的话 java.util.concurrent.ThreadPoolExecutor 那么线程池管理将不会由Spring处理。

    回答你的第二个问题 -如果你用的是弹簧 然后线程池管理将由Spring处理。您将了解核心池大小、最大池大小和队列容量,以了解如何控制同时运行的线程数。

    我认为您混淆了Spring基本上是一个IOC容器和Spring提供的 线程池任务执行器 对于线程池管理(这只是Spring版本的Java java.util.concurrent.ThreadPoolExecutor

    这样理解: 当你这么做的时候 taskExecutor.execute(aTask1); 线程池任务执行器 ,bean管理也将由Spring处理,因为 aTask1 是春豆的对象。当你这么做的时候 taskExecutor.execute(new ATask("A task 1")); 线程池任务执行器 new