Multithreading

Проработать

  1. Дмитрий Чуйко — Новинки в java.util.concurrent
  2. Глеб Смирнов — Расчленяя многопоточность
  3. Java Concurrency in Practice, глава 1 — Книжный клуб .rar
  4. Multithreading in Java Explained in 10 Minutes
  5. Тестовое задание Java Многопоточность
  6. Глеб Смирнов — Многопоточность Java под капотом
  7. Многопоточность в Java: ExecutorService
  8. Параллельность в Java на практике
  9. Мастерство многопоточности: Превращаем Java в шедевр параллельного программирования
  10. Многопоточность без боли: моя шпаргалка для собесов в Java
  11. Введение в многопоточность в Java очень простым языком: Процессы, Потоки и Основы синхронизации
  12. Java 8 в параллель. Учимся создавать подзадачи и контролировать их выполнение
  13. Java. Многопоточность для самых маленьких. Часть 1
  14. Многопоточность для самых маленьких. Виртуальные потоки. Часть 2
  15. Вопрос на сертификационном экзамене: применение Threads и Executors
  16. Синхронизация в Java, часть 1: состояния гонки, блокировки и условия
  17. Как сделать параллельные транзакции
  18. Deadlock

  19. Как устроить Deadlock, а затем уйти от взаимной блокировки навсегда
  20. Java. Многопоточность. Как устроить Deadlock

Что это

Multithreading - возможность выполнять несколько потоков(threads) параллельно внутри одного процесса.

Concurrency

Concurrency(Конкурентность) - это способность программы управлять несколькими задачами одновременно, но не обязательно выполнять их в один и тот же момент времени. Хотя один CPU-ядро может обрабатывать только одну задачу за раз, оно достигает конкурентности, быстро переключаясь между задачами.

Процессор может переключаться между задачами.

Кажется, что задачи выполняются одновременно, но на самом деле CPU быстро переключается между ними.

Parallelism(Параллелизм)

Parallelism - это реальное одновременное выполнение задач. Задачи выполняются в разных потоках одновременно.

Основные разделы

Процесс(Process)

Процесс(Process) - единица операционной системы. На которую выделена память и др. ресурсы. Содержит в себе потоки. Процесс в Java — это JVM. Запуская Java-программу, вы запускаете процесс: java MyProgram. Каждый процесс содержит хотя бы один поток(Main).

Поток(Thread)

Поток(Thread) - единица исполнения кода.

Поток имеет stack и memory для исполнения. Потоки исполняются на ядрах процессора. Чаще всего одна программа состоит из одного процесса, но бывают и исключения (например, браузер Chrome создает отдельный процесс для каждой вкладки, что дает ему некоторые преимущества, вроде независимости вкладок друг от друга). Процессы изолированы друг от друга, поэтому прямой доступ к памяти чужого процесса невозможен (взаимодействие между процессами осуществляется с помощью специальных средств).

Приложение живо пока жив хоть один поток.

Главный поток(main thread) запускает метод main, и всё выполнение программы начинается с него.

Для чего используют многопоточность

  1. Параллельное выполнение задач, которые можно выполнять одновременно.
  2. Задачи, зависящие от ожидания (I/O-bound).
  3. Вычислительно сложные задачи (CPU-bound).
  4. Обработка событий и интерфейсов.
  5. Реализация фоновых задач.

Критическая секция

Критическая секция - участок исполняемого кода программы, в котором производится доступ к общему ресурсу (данным или устройству), который не должен быть одновременно использован более чем одним потоком выполнения. При нахождении в критической секции двух (или более) потоков возникает состояние «гонки» («состязания»). Во избежание данной ситуации необходимо выполнение четырех условий:

Способы создания потоков

  1. Создать класс с реализацией Runnable, его объект передать его в конструктор класса Thread и вызвать метод start(). Этот интерфейс содержит один метод run(), который будет выполняться в новом потоке. Поток закончит выполнение, когда завершится его метод run().
  2. Наследоваться от класса Thread и переопределить его метод run().
  3. Создать объект реализации Callable передать его в реализацию ExecutorService.

Основные недостатки многопоточности

Советы