Не понимаю какое-то поведение @async - PullRequest
2 голосов
/ 15 ноября 2010

У меня возникают трудности с пониманием определенного аспекта аннотации @async и, возможно, работы потоков и объединения потоков в целом. Когда я устанавливаю это в моем весеннем конфигурационном файле:

<task:executor id="WhifExecutor" pool-size="10"/>
<task:annotation-driven executor="WhifExecutor" />

не значит ли это, что будет запущено только 10 потоков? Тем не менее, когда я запускаю функцию с @async 1000 раз, она сразу же продолжается с остальной частью кода после вызова (в консоли отображается простое сообщение, показывающее, сколько раз функция была вызвана). Затем через некоторое время функции пула начинают возвращать свои значения, но, как ни странно, только из 1 пула и 10 различных потоков. Что здесь происходит? Как он может вызывать все эти 1000 функций, но использовать только 10 потоков? Может быть, он помещает их все в какой-то стек перед запуском потоков? Я попытался прочитать документацию по этому вопросу, но не смог найти ничего об этом явлении.

Кроме того, есть ли способ заставить его ждать запуска потоков, чтобы я не сразу вызывал пару тысяч функций одновременно?

1 Ответ

6 голосов
/ 15 ноября 2010

Возможно ли поместить все их в какой-либо стек перед запуском потоков?

Не стек, а очередь.

Исполнителю будет выделено 10потоки.Если все 10 потоков заняты и новые задачи добавлены, они будут добавлены в очередь и выполнены по очереди.Одновременно будет выполнено не более 10 задач.

...