Как заставить весну управлять потоком анонимного класса - PullRequest
0 голосов
/ 21 сентября 2018

Я понимаю, что если я сделаю следующее, я смогу заставить пружину управлять нитью

@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"));

Я предполагаю, что во втором случае создание потока не управляется пружиной при выполнении.

Второй вопрос, для приведенного ниже кода:

this.taskExecutor.execute(new Runnable() {
       @Override
       public void run() {...}});

Есть ли пружинауправлять / контролировать количество одновременно запущенных потоков?Как мне заставить его работать так же, как поток с @Component и @Scope ("прототип")?- Один из вариантов - переместить код в другой класс, но мы стараемся избегать этого, поскольку у нас много таких небольших методов.

1 Ответ

0 голосов
/ 21 сентября 2018

Ответ на ваш первый вопрос - нет разницы между первым и вторым, в обоих случаях Spring будет осуществлять управление пулом потоков, потому что вы вызываете метод execute в Spring * ThreadPoolTaskExecutor,если бы вы вызывали его на java.util.concurrent.ThreadPoolExecutor, то Spring не мог бы обработать управление пулом потоков.

Ответ на ваш второй вопрос - если вы используете Spring * ThreadPoolTaskExecutor, тогда управление пулом потоковбудет обработан весной.Вы прочитали о размере основного пула, максимальном размере пула и емкости очереди, чтобы понять, как контролировать количество одновременно работающих потоков.

В целом Я думаю, что вы не уверены в том, что Spring фундаментальноконтейнер IOC и Spring предоставляют ThreadPoolTaskExecutor для управления пулом потоков (что является ничем иным, как версией Spring java.util.concurrent.ThreadPoolExecutor в Java).

Поймите это следующим образом: когда вы делаете taskExecutor.execute(aTask1);, тогда управление пулом потоков будет обрабатываться Spring, потому что вы используете Spring * ThreadPoolTaskExecutor, так же как управление компонентами будет обрабатываться Spring, потому что SpringaTask1 является объектом Spring bean.И когда вы делаете taskExecutor.execute(new ATask("A task 1"));, тогда управление пулом потоков будет обрабатываться Spring, потому что вы используете Spring ThreadPoolTaskExecutor, НО на этот раз управление бином не будет выполняться Spring, потому что вы используете new для создания объекта самостоятельно.

...