2012-05-02 2 views
0

Я пишу модуль, в котором будет создано множество потоков, выполняющих некоторую задачу. Таким образом, в целом у меня есть класс «Менеджер», который предоставляет информацию классу «Resolver», который создает и отправляет «Задачу», используя threadpool.Стратегия поиска уже порожденной задачи в очереди

У Resolver есть исполнитель threadpool, у которого есть неограниченная очередь, которую я использую, чтобы проверить, не создано ли перкулярное задание. Если в очереди уже есть экземпляр задачи, я удаляю его с помощью ThreadPoolExecutor и снова отправляю новую задачу. Это делается намеренно, поскольку новая задача выводит новую информацию из «Менеджера».

Я использую ThreadPoolexecutor для поиска, если задача уже есть очередь. Но я беспокоюсь о производительности очереди и считаю, что хэш-карта будет лучшим выбором, поскольку в очереди может быть более 30000 экземпляров задачи.

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

+0

Вместо поиска задачи вы можете использовать 'Future.cancel (false)', который остановит задачу, если она еще не запущена. –

ответ

0

Я не думаю, что это вызовет проблемы (если вы не реализуете слишком сложную равную реализацию). Я бы рекомендовал запустить тест с профилировщиком и посмотреть, действительно ли это проблема или нет ...

Однако, если это так, вы можете создать свою собственную реализацию BlockingQueue (она может быть передана ThreadPollExecutor как аргумент конструктора). Таким образом, вы можете создать гибрид некоторой реализации BlockingQueue (для стандартной рабочей очереди) и HashSet (для теста fast contains (...)). Помните о правильной синхронизации для всех операций над этими коллекциями. Все операции должны быть атомарными.

+0

Спасибо. Я перейду с BlockingQueue и удалю его, чтобы удалить любую ожидающую задачу. Когда вы говорите, что все операции являются атомарными, вы рекомендуете мне использовать синхронный метод, чтобы сделать его атомарным? Или любые другие лучшие души? – user832096

+0

Если вы не инкапсулируете класс своей собственной реализацией, вам не нужно беспокоиться о синхронизации. – MikePatel

+0

Да, я бы рекомендовал синхронизировать все методы. Кроме того, вы можете использовать Lock (http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/locks/Lock.html). – altanis

Смежные вопросы