сервлета организовать параллельную обработку запросов. Запрос приходит в сервлет, там он перенаправляется в класс где по URI и методу для него сопоставляется таска, которая ложится в блокирующую очередь. В другом классе с помощью ExecutorService таски параллельно выполняются и выдается ответ. В чем суть вопроса: Как связать закидывание в очередь и выполнение задач? Хочется 1 раз создать поток и останавливать его, когда очередь пуста. А при добавлении задачи проверялось поток активен или нет. Был бы признателен за совет/ресурс, а то не могу в голове это представить.
ну убери проверку while(!QUEUE. isEmpty()) { и будет бесконечно работать
Я подумал о том что модно ввделит доп класс который будет управлять временем жизни потока и очередью соответственно. У этого надоьсделать метод добавления в очередь и в этот момент запускать тред чтоб он эту очередь разгребал. Соответственно если добавляет а треду уже запущен то ничего и делать не надо
Хотя второй ваш скрин показывает что вы и так запускаете каждую задачу в очереди в отдел ном потоке. Не очень понимаю зачем вы делаете вейт в конце на текущем потоке
Я хотел чтобы у меня создался поток только один раз и при пустой очереди он просто останавливался и ждал пока не поступит другая таска. А при добавлении задачи у меня просто проверялось работает ли обработчик очереди и если нет, то он бы возобновлял работу
Что есть обработчик очереди? ExecutorService? Он же сам у себя под капотом будет менеджерить как ему запускать задачи. Я просто не уверен что понимаю вашу задумку.
После добавления в очередь задачи, я хочу проверять работает ли у меня поток с ExecutorService. Если да, то ничего не делаем, а иначе запускаем исполнение. И пока очередь у нас не пуста ExecutorService делает свою работу, а как только он ее сделал, то заснет и будет ждать пока опять в очередь не поступят задачи.
ExecutorService это сам и делает без всякой очереди же
Да, но задача состоит в том, чтобы их подружить
Если хочешь с этим побаловаться, то бери котлин и корутины Либо лум
Это какое то тестовое?
Зачем здесь лум, если человек хочет парковать поток, когда нет работы.
что парковать, если executorservice и так в новом потоке все делает
Ну я не изначальный вопрос отвечал, а на последний.
Я правильно понимаю, что вам хочется, чтоб поток "не использовался", пока очередь пустая?
Тогда не переживайте, blocking queue вся сделана на condition, которые в свою очередь сделаны на pthread_cond_signal, так что ваш поток будет спать, пока ему не посигналят, что в очереди что-то есть.
Executor service предоставляет вам вам для запуска задач. Он сам решает на каком потоке и когда ее исполнять. Вам ничего проверять не надо.
Обсуждают сегодня