У меня проблема, которую я считаю классическим шаблоном мастера/работника, и я ищу совета по реализации. Вот что я сейчас думаю о проблеме:Шаблоны/принципы для потокобезопасных очередей и программы «мастер/работник» в Java
Существует глобальная «очередь», и это центральное место, где хранится «работа, которая должна быть выполнена». Предположительно, эта очередь будет управляться каким-то «главным» объектом. Темы будут созданы, чтобы найти работу, и когда они найдут работу, они расскажут мастеру (что бы это ни было) «добавить это в очередь выполняемой работы».
Мастер, возможно, с интервалом, будет порождать другие потоки, которые фактически выполняют выполняемую работу. Как только поток завершит свою работу, я хочу, чтобы он уведомил мастера о завершении работы. Затем мастер может удалить эту работу из очереди.
В прошлом я проделал большое количество программирования потоков на Java, но все это было до JDK 1.5, и поэтому я не знаком с соответствующими новыми API-интерфейсами для обработки этого случая. Я понимаю, что JDK7 будет иметь fork-join, и это может быть решением для меня, но я не могу использовать продукт раннего доступа в этом проекте.
Проблемы, как я их вижу, является:
1) как есть «тема, делая работу» общаться обратно к мастеру, говоря им, что их работа будет завершена, и что хозяин теперь может удалить работа из очереди
2) как эффективно иметь гарантию мастера, что работа запланирована только один раз. Например, предположим, что эта очередь имеет миллион элементов, и она хочет сказать работнику «пойти на эти 100 вещей». Каков наиболее эффективный способ гарантировать, что, когда он планирует работу для следующего работника, он получает «следующие 100 вещей», а не «100 вещей, которые я уже запланировал»?
3) выбор соответствующей структуры данных для очереди. Мое мышление здесь состоит в том, что «работа над поисками нитей» потенциально могла бы найти ту же работу, что и несколько раз, и они отправили сообщение хозяину, сказав «вот работа», и мастер поймет, что в работе есть уже запланированы и, следовательно, должны игнорировать сообщение. Я хочу, чтобы я выбрал нужную структуру данных, чтобы эти вычисления были как можно дешевле.
Традиционно я бы сделал это в базе данных, в виде машины с конечным автоматом, работая «задачи» от начала до конца. Однако в этой проблеме я не хочу использовать базу данных из-за большого объема и волатильности очереди. Кроме того, я хотел бы сохранить это как можно более легким. Я не хочу использовать любой сервер приложений, если этого можно избежать.
Весьма вероятно, что эта проблема, которую я описываю, является общей проблемой с известным именем и принятым набором решений, но я, с моей низкой степенью не-CS, не знаю, что это называется (т.е. будьте осторожны).
Спасибо за любые указатели.
вы также можете посмотреть на http://lambda-the-ultimate.org/node/3521 «Ядро вилки/объединение» –