Skip to content

Files

Latest commit

 

History

History

m11-multithreading

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 
 
 

Программа модуля

  1. Многопоточность
    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


11.4. Домашняя работа 11.1

Цель задания

Научиться работать с классом 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.
«Незачёт» — задание не выполнено.


11.13. Домашняя работа 11.2

Цель задания

Научиться работать с syncronyzed блоками и избегать ситуации deadlock.

Условие задания

Проект Transactions. В банке (класс Bank) есть счета (класс Account) с двумя полями — money и accNumber.

Все счета хранятся внутри банка. Множество клиентов банка могут одновременно переводить деньги между счетами и запрашивать баланс по своему счёту. Всё происходит в highly concurrent (многопоточной) среде.

При этом транзакции на суммы > 50000 отправляются на проверку в службу безопасности. Можно считать, что таких транзакций не более 5% от всех. За проверку отвечает отдельный и уже реализованный метод Bank.isFraud().

Служба безопасности не может обрабатывать более одной транзакции одновременно. Проверка занимает 1000 мс.

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

Что нужно сделать

  1. Создайте метод transfer() класса Bank, который переводит деньги с одного счёта на другой. Если сумма транзакции > 50000 — транзакция отправляется на проверку службе безопасности: вызывается метод isFraud(). Если возвращается true, то счета блокируются (как – на ваше усмотрение).
  2. Создайте метод getBalance() класса Bank, который возвращает остаток на счёте по переданной строке номера аккаунта.

Рекомендации

  • Для решения задачи вы можете дорабатывать классы Account и Bank как угодно.
  • Дополнительно создайте тест (или набор тестов) для эмуляции реальной работы этих двух классов и проверки системы.
  • Проверяйте сумму на банковских счетах до запуска транзакций и после завершения — сумма в банке не должна измениться.
  • Удостоверьтесь, что ваша программа работает в многопоточном режиме. Для этого можете использовать утилиту visualVM.

Решение

TASK_11_2: Transactions

Критерии оценки

«Зачёт» — программа позволяет в многопоточной среде работать банковским транзакциям без «потери» денег в банке и ситуаций deadlock.
«Незачёт» — задание не выполнено.


11.21. Домашняя работа 11.3

Цель задания

Научиться использовать ForkJoinPool для решения рекурсивных задач.

Что нужно сделать

Напишите приложение, которое в многопоточном режиме сформирует карту заданного сайта (список ссылок), и запишите её в файл. Ссылки на дочерние страницы должны располагаться в файле с отступами на одну табуляцию относительно родительских.

Пример

https://skillbox.ru/
    https://skillbox.ru/media/
        https://skillbox.ru/media/management/
            https://skillbox.ru/media/management/kak_rat_podkhod/

Рекомендации

  • В файле должны быть ссылки на страницы, размещённые на том же домене (в примере — skillbox.ru). В списке не должно быть:

    1. ссылок на другие сайты и поддомены,
    2. ссылок на внутренние элементы страниц (у таких ссылок есть символ # после адреса страницы).
  • При запросе страниц нужно выдерживать паузы (с помощью метода sleep() у потока), чтобы сайт не заблокировал доступ вашего приложения. Используйте значения от 100 до 150 мс.

  • Для отладки программы выберите сайт с сотнями или тысячами страниц (например, http://www.lenta.ru/), чтобы сервер вас не заблокировал.

Решение

TASK_11_3: SitemapCreator

Критерии оценки

«Зачёт» — программа формирует список ссылок любого сайта и сохраняет в текстовый файл.
«Незачёт» — задание не выполнено.