- Многопоточность
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
Критерии оценки
«Зачёт» — программа формирует список ссылок любого сайта и сохраняет в текстовый файл.
«Незачёт» — задание не выполнено.