Класс "Client" имеет список данных в виде List от 1 до 100.
private Integer findDataByIndex(int index)
: метод для получения данных из списка по индексу и удаления этого значения из общего списка данных;public void sendData()
: метод для отправки запроса на сервер. Генерирует случайный индекс. Затем создает объект класса "Request" с этим значением и отправляет его на сервер в асинхронном режиме с задержкой в диапазоне от 100 до 500 мс. В методе выполняются проверки отправленных данных с логированием в файл resources/logs/application.log и консоль.public void addResponseToCheck(Response response)
: метод для добавления значения Response в accumulator.
Класс "Server" получает запросы от клиента и обрабатывает их. Метод обработки запроса имеет рандомную задержку в диапазоне от 100 до 1000 мс.
public Response processRequest(Request request)
: метод для обработки запросов от клиента. Возвращает общий размер принятых данных.public boolean checkData(List<Integer> dataList)
: метод для проверки принятых данных с изначалиным листом перед отправкой.
- После отправки всех запросов клиентом, размер списка данных в клиенте должен быть равен 0 (Итоговый результат записан в файл логов).
- Список данных в сервере должен содержать значения от 1 до n без пробелов и повторений, и его размерность должна составлять n (Итоговый результат записан в файл логов).
- Значение accumulator в клиенте должно быть равно (1+n) * (n/2) (Итоговый результат записан в файл логов).
Для проверки взаимодействия между клиентом и сервером, созданы объекты классов "Client" и "Server" и проверена их работа в многопоточности (Итоговый результат записан в файл логов).
В реализации использованы следующие классы из пакета java.util.concurrent:
- Lock: для обеспечения синхронизации доступа к общему ресурсу "List" у клиента.
- Callable: для выполнения запроса на сервер в отдельном потоке.
- Executor: для управления потоками обработки запросов.
- Future: для получения результата выполнения задачи обработки запроса.