⏱ 10–15 min

Многозадачность vs. многопоточность

Добро пожаловать на урок, посвященный многопоточности в Java! В этом разделе вы познакомитесь с одной из ключевых возможностей языка Java — многопоточностью. Многопоточность позволяет программе выполнять несколько потоков одновременно, что повышает производительность и эффективность приложения. В данном уроке мы рассмотрим основные концепции многопоточности, такие, как создание и управление потоками, синхронизация и взаимодействие между потоками, а также примеры. Этот материал необходим для понимания того, как эффективно разрабатывать многозадачные приложения и использовать ресурсы процессора на полную мощность.

1. Многозадачность 

Многозадачность бывает двух типов:

  • на основе процессов 
  • на основе потоков

1.1. Многозадачность на основе процессов

Многозадачность на основе процессов - это средство, которое позволяет одновременно выполнять две или несколько программ на компьютере. Процесс, по существу, является выполняющейся программой. Процессы являются крупными задачами, каждой из которых требуется свое адресное пространство. Связь между процессами ограничена и обходится дорого. Переключение контекста с одного процесса на другой также обходится дорого. Процесс может иметь несколько потоков. Количество потоков может меняться во время выполнения процесса.

1.2. Многозадачность на основе потоков

Многозадачность на основе потоков - означает, что одна программа может выполнять две или несколько задач одновременно. Потоки исполнения более просты чем процессы. Они совместно используют одно и то же адресное пространство и один и тот же крупный процесс. Связь между потоками исполнения обходится недорого, как, впрочем, и переключение контекста с одного потока исполнения на другой.

2. Многопоточность в Java

В Java многозадачность реализована на основе потоков. Многопоточное программирование применяют для сведения к минимуму времени простоя системы, поскольку сразу несколько задач могут выполняться одновременно. В Java поток определяет два разных понятия – “поток выполнения” и “объект класса java.lang.Thread”.

При запуске Java-программы начинает выполняться главный поток (main). Особенность главного потока состоит в том, что в нем порождаются все дочерние потоки. Главный поток отождествляется с программой. Программа начинается с выполнения главного потока и должна завершаться с завершением главного потока. В отличие от дочерних потоков главный поток создается автоматически.

Потоки совместно используют:

  • переменные класса и статические переменные;
  • динамически распределяемую память (кучу);
  • системные ресурсы, выделенные процессу.

Каждый поток имеет свои собственные локальные переменные (т.е. свой собственный стек).

3. Способы создания и инициализации потока

  1. Расширяем класс java.lang.Thread ИЛИ реализуем интерфейс java.lang.Runnable (более предпочтительный вариант).
  2. Переопределяем метод run().
  3. Запускаем поток с помощью метода start().