- Многопоточность
11.1. Зачем нужна многопоточность
11.2. Класс Thread
11.3. Интерфейс Runnable
11.4. Домашняя работа 11.1
11.5. Состояние гонки и критические секции
11.6. Атомарные переменные
11.7. Ключевое слово Volatile
11.8. Synchronized-методы
11.9. Synchronized-блоки
11.10. Взаимодействие потоков — методы Wait и Notify
11.11. Потокобезопасные классы
11.12. Взаимная блокировка — Deadlock
11.13. Домашняя работа 11.2
11.14. Интерфейс Callable
11.15. Executors, Executor и ExecutorService
11.16. Метод Shutdown
11.17. ThreadPoolExecutor
11.18. ScheduledExecutorService
11.19. Приостановка и прерывание потоков
11.20. ForkJoinPool и RecursiveTask
11.21. Домашняя работа 11.3
EXAMPLE_11_1: ImageResizer
EXAMPLE_11_2: Concurrency
EXAMPLE_11_3: Deadlock
TASK_11_1_1: ImageResizer
TASK_11_1_2: ImageResizer
TASK_11_2: Transactions
TASK_11_3: SitemapCreator
Цель задания
Научиться работать с классом Thread.
Что нужно сделать
Напишите программу уменьшения изображений на основе проекта ImageResizer. Она должна запускать число потоков, равное количеству ядер процессора вашего компьютера.
Решение
TASK_11_1_1: ImageResizer
Критерии оценки
«Зачёт» — при запуске программы уменьшается размер изображений и они копируются в указанную папку.
«Незачёт» — задание не выполнено.
Дополнительное задание*
Цель задания
Используя библиотеку Imgscalr, уменьшать изображение без потери качества.
Что нужно сделать
- Согласно инструкции включить поддержку сборщика maven в свой проект.
- Внедрить библиотеку Imgscalr в проект.
- Использовать метод для уменьшения изображения.
public static BufferedImage resize(BufferedImage src, int targetWidth,
int targetHeight, BufferedImageOp... ops)Решение
TASK_11_1_2: ImageResizer
Критерии оценки
«Зачёт» — изменение размера изображений производится с использованием библиотеки Imgscalr.
«Незачёт» — задание не выполнено.
Цель задания
Научиться работать с syncronyzed блоками и избегать ситуации deadlock.
Условие задания
Проект Transactions. В банке (класс Bank) есть счета (класс Account) с двумя полями — money и accNumber.
Все счета хранятся внутри банка. Множество клиентов банка могут одновременно переводить деньги между счетами и запрашивать баланс по своему счёту. Всё происходит в highly concurrent (многопоточной) среде.
При этом транзакции на суммы > 50000 отправляются на проверку в службу безопасности. Можно считать, что таких транзакций не более 5% от всех. За проверку отвечает отдельный и уже реализованный метод Bank.isFraud().
Служба безопасности не может обрабатывать более одной транзакции одновременно. Проверка занимает 1000 мс.
Если служба безопасности обнаружила мошенничество, необходимо заблокировать оба счёта, то есть запретить любые изменения остатков в дальнейшем.
Что нужно сделать
- Создайте метод
transfer()классаBank, который переводит деньги с одного счёта на другой. Если сумма транзакции > 50000 — транзакция отправляется на проверку службе безопасности: вызывается методisFraud(). Если возвращаетсяtrue, то счета блокируются (как – на ваше усмотрение). - Создайте метод
getBalance()классаBank, который возвращает остаток на счёте по переданной строке номера аккаунта.
Рекомендации
- Для решения задачи вы можете дорабатывать классы
AccountиBankкак угодно. - Дополнительно создайте тест (или набор тестов) для эмуляции реальной работы этих двух классов и проверки системы.
- Проверяйте сумму на банковских счетах до запуска транзакций и после завершения — сумма в банке не должна измениться.
- Удостоверьтесь, что ваша программа работает в многопоточном режиме. Для этого можете использовать утилиту visualVM.
Решение
TASK_11_2: Transactions
Критерии оценки
«Зачёт» — программа позволяет в многопоточной среде работать банковским транзакциям без «потери» денег в банке и ситуаций deadlock.
«Незачёт» — задание не выполнено.
Цель задания
Научиться использовать ForkJoinPool для решения рекурсивных задач.
Что нужно сделать
Напишите приложение, которое в многопоточном режиме сформирует карту заданного сайта (список ссылок), и запишите её в файл. Ссылки на дочерние страницы должны располагаться в файле с отступами на одну табуляцию относительно родительских.
Пример
https://skillbox.ru/
https://skillbox.ru/media/
https://skillbox.ru/media/management/
https://skillbox.ru/media/management/kak_rat_podkhod/
Рекомендации
-
В файле должны быть ссылки на страницы, размещённые на том же домене (в примере — skillbox.ru). В списке не должно быть:
- ссылок на другие сайты и поддомены,
- ссылок на внутренние элементы страниц (у таких ссылок есть символ # после адреса страницы).
-
При запросе страниц нужно выдерживать паузы (с помощью метода
sleep()у потока), чтобы сайт не заблокировал доступ вашего приложения. Используйте значения от 100 до 150 мс. -
Для отладки программы выберите сайт с сотнями или тысячами страниц (например, http://www.lenta.ru/), чтобы сервер вас не заблокировал.
Решение
TASK_11_3: SitemapCreator
Критерии оценки
«Зачёт» — программа формирует список ссылок любого сайта и сохраняет в текстовый файл.
«Незачёт» — задание не выполнено.