![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
novichiok |
|
|||
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 15.9.2011 Репутация: нет Всего: нет |
Здравствуйте. Стоит такая задача: - Запретить доабавление тасков которые уже имеются в очереди задач для пула. Подробнее:
В приложении создан фиксед-пул, с заданной очередью(ArrayBlockingQueue с фиксированным размером).В пул сабмитятся Runnabl'ы,сабмитятся из разных потоков . В этих Runnabl'ах есть поле id. Мне нужно сделать так, чтобы Runnabl не мог быть добавлен в очередь если в ней уже есть Runnabl с таким же id. При чем уникальная задача должна быть не *все* время работы а только в очереди. То есть допустим , засабмитили Runnable с id1, он выполнился, удалился из очереди, и теперь снова можно сабмитить Runnable с id1. Как это правильно, канонично реализовать ? Отнаследоваться от BlockingQueue и переопределить метод который дергает пуловский submit() при добавлении тасков ? В таком случае боюсь что-то поломать в синхронизации самой очереди.. |
|||
|
||||
priam220 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 4.6.2010 Репутация: 7 Всего: 8 |
не притендую на каноничность, но можно сделать так:
Hashmap<Integer, Runnable> m; synchronyzed(m){ if(!m.contains(id)){ m.put(id,new Runnable()) } } |
|||
|
||||
novichiok |
|
|||
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 15.9.2011 Репутация: нет Всего: нет |
Ну? а в пул как пихать?
PS:у мапа и так функциональность Set'а по ключам Это сообщение отредактировал(а) novichiok - 21.10.2011, 20:16 |
|||
|
||||
Stolzen |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1041 Регистрация: 17.10.2005 Репутация: 23 Всего: 48 |
Ну так сделать свою реализацию пула, которая перед "пиханием" проверяет наличие, и в случае чего реджектит таск.
Добавлено через 10 минут и 8 секунд
Но нужно для реализаций Runnable корректно определить equals и hashCode |
|||
|
||||
novichiok |
|
|||
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 15.9.2011 Репутация: нет Всего: нет |
Спасибо за ответ. *НО* в таком случае, как Вы описали обеспечивается уникальность тасков всегда, даже после его выполнения. Мне это не подходит, нужно чтоб в каждый момент времени в очереди задач находились только уникальные таски. Если таск был засабмичен и выполнен, то его можно засабмитить снова.
|
|||
|
||||
Stolzen |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1041 Регистрация: 17.10.2005 Репутация: 23 Всего: 48 |
Так сделайте, чтобы после успешного выполнения таск убирал себя из этого сета.
|
|||
|
||||
Kangaroo |
|
|||
![]() AA - Aussie Animal ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2042 Регистрация: 7.10.2006 Где: US Репутация: 21 Всего: 104 |
Или (только наследовать надо ArrayBlockingQueue):
или использовать композицию, как описано here. -------------------- Lost.... |
|||
|
||||
novichiok |
|
|||
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 15.9.2011 Репутация: нет Всего: нет |
Спасибо, да, Дуга Ли нужно почитать
|
|||
|
||||
LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15717 Регистрация: 24.3.2004 Где: Dublin Репутация: 209 Всего: 537 |
Не выйдет. Судя по описанию задачи, пока задача выполняется добавлять новую нельзя. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
novichiok |
|
|||
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 15.9.2011 Репутация: нет Всего: нет |
А как ведет себя пул ? Он удаляет таск из очереди в начале выполнения таска , или уже после ? То есть , взял его из очереди,не удалив при этом, выполнил, после чего удалил.., либо сразу берет таск, удаляя его из очереди и выполняет его ? Это сообщение отредактировал(а) novichiok - 26.10.2011, 18:43 |
|||
|
||||
Stolzen |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1041 Регистрация: 17.10.2005 Репутация: 23 Всего: 48 |
Это сообщение отредактировал(а) Stolzen - 27.10.2011, 09:57 |
|||
|
||||
LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15717 Регистрация: 24.3.2004 Где: Dublin Репутация: 209 Всего: 537 |
Удаляет и выполняет. В противном случае трудно сделать так, чтобы одну таску выполнял только один поток. У ThreadPoolExecutor есть методы
Второй как раз хорошо подойтет для удаления таски из distinct списка. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
novichiok |
|
|||
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 15.9.2011 Репутация: нет Всего: нет |
Всех благодарю за помощь. Действительно к данной проблеме есть множество решений. Я у себя немного переделал логику и исключил возможность добавления дубликатов уже не на уровне пула или очереди
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |