Архитектура пула ресурсов

Рейтинг: 1Ответов: 1Опубликовано: 30.04.2015

Задание: Создать многопоточное приложение, корректно работающее с разделяемыми ресурсами и избегающее ситуаций взаимной блокировки. Любая сущность, желающая получить доступ к разделяемому ресурсу, должна быть потоком. Использовать java.util.concurrent и java.util.concurrent.locks. Тема: CallCenter. Имеется несколько операторов. Оператор может обслуживать одновременно одного клиента. При отсутствии свободных операторов CallCenter ставит звонки в очередь. Клиент, стоящий в очереди, может положить трубку и перезвонить ещё раз через некоторое время. Реализовать на Java.

Я выделил классы Client, Operator и CallCenter. Ясно, что должна быть очередь клиентов, очередь операторов, а CallCenter должен их обслуживать. Не очень ясно как всё устроить.

Вопрос: какие из этих классов должны быть потоками, какую очередь лучше использовать в моём случае?

Ответы

▲ 4Принят

Если это учебное задание на пул ресурсов - то очевидно, что ресурсом тут будет оператор, ведь при попытке навечно запереть клиента в пуле он будет вырываться, кричать что хочет домой и пытаться позвонить в полицию.

А класс CallCenter тут явно лишний - ведь в задаче есть только клиенты и операторы, колл-центр не более чем антураж. Конечно, в решении понадобится какой-нибудь контейнер для операторов - но назвать его лучше как OperatorsPool, чтобы было понятно что он делает.

Методом исключений, роль потока остается клиенту. Звонок оператору - это вызов некоторого метода, получающего элемент из пула. Отмена звонка - это прерывание вызова, обычно такая операция делается через CancellationToken, но можно обойтись и тайм-аутом. Завершение звонка - это возврат оператора в пул.