Поиск по сайту:

Многопоточность в Java — все, что вы ДОЛЖНЫ знать


Когда мы запускаем реальное приложение, мы используем хорошие процессоры для более быстрого выполнения. Но только скорость процессора не может заставить ваше приложение работать быстро. Один из замечательных способов создать производительное приложение — использовать многопоточность.

Что такое многопоточность?

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

Многопоточность против многопроцессорности

Когда мы говорим о многопоточности, нам все равно, 2-ядерный процессор у машины или 16-ядерный. Наша работа состоит в том, чтобы создать многопоточное приложение и позволить операционной системе обрабатывать часть распределения и выполнения. Короче говоря, многопоточность не имеет ничего общего с многопроцессорностью.

Как Java поддерживает многопоточность?

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

Какие существуют типы нитей?

В приложении есть два типа потоков — пользовательский поток и поток демона. Когда мы запускаем приложение, основным является первый созданный пользовательский поток. Мы можем создавать несколько пользовательских потоков, а также потоки демона. Когда все пользовательские потоки выполнены, JVM завершает программу.

Что такое приоритет потока?

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

Как мы создаем поток в Java?

Мы можем создавать потоки, реализуя интерфейс Runnable или расширяя класс потока.

Thread t = new Thread(new Runnable(){
    @Override
    public void run() {
    }
});

Выше приведен однострочный оператор для создания нового потока. Здесь мы создаем Runnable как анонимный класс. Если вы знакомы с лямбда-выражениями, мы можем создать поток с гораздо более коротким кодом.

Runnable runnable = () -> System.out.println("Hello");

Как только мы создали поток, мы должны начать его выполнение, вызвав метод start().

runnable.start();

Я написал много постов, объясняющих концепции многопоточности в Java. Вы можете просмотреть их последовательно, чтобы узнать все о многопоточности, ее реальном использовании, жизненном цикле потоков, пуле потоков и т. д.

1. Java Thread и Runnable

Это первый пост о классе Thread и интерфейсе Runnable. Вы также узнаете о процессах и потоках. В чем разница между потоком и процессом? Преимущества использования потоков и то, как мы можем создавать потоки, используя интерфейс Runnable и класс Thread. В этом посте также сравнивается интерфейс Runnable с классом Thread.

2. Сон потока Java

Сон Java Thread используется для приостановки выполнения текущего потока. Мы будем широко использовать спящий режим в будущих сообщениях, поэтому полезно знать, как он работает и является ли он точным или нет?

3. Присоединение к потоку Java

Иногда нам нужно подождать, пока другие потоки закончат свое выполнение, прежде чем мы сможем продолжить. Мы можем добиться этого, используя метод объединения потоков, узнать, как он работает и когда его следует использовать.

4. Состояния потоков Java

Понимание различных состояний потока важно. Узнайте, как поток изменяет свое состояние и как планировщик потоков операционной системы изменяет состояние потока.

5. Java Thread ждет, уведомляет и уведомляет всех

Класс Java Object содержит три метода для передачи состояния блокировки ресурса. Узнайте на примере использования этих методов класса Object в простой реализации Wait-Notify.

6. Безопасность потоков и синхронизация

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

7. Исключение Java в основном потоке

JVM создает первый поток, используя основной метод. В этом посте объясняются некоторые распространенные исключения, которые мы наблюдаем в повседневной жизни, их основная причина и способы их устранения.

8. Потокобезопасность в классе Singleton

В этой статье вы познакомитесь с основными понятиями создания класса Singleton. Каковы проблемы безопасности потоков в разных реализациях? Как мы можем добиться потокобезопасности в классе Singleton.

9. Поток демона в Java

Простая статья, объясняющая потоки демона и то, как мы можем создавать потоки демона в java.

10. Локальный поток Java

Мы знаем, что потоки совместно используют переменные объекта, но что, если мы хотим, чтобы локальные переменные потока создавались на уровне класса. Java предоставляет служебный класс ThreadLocal для создания локальных переменных потока. Узнайте больше, чтобы узнать, как мы можем создавать переменные ThreadLocal в программе Java.

11. Дамп потока Java

Дамп потока Java предоставляет информацию о текущем потоке. Дамп потока полезен для анализа проблем с производительностью приложения. Вы можете использовать дамп потока для поиска и устранения взаимоблокировок. В этом посте объясняются различные методы, которые можно использовать для создания дампов потоков в java.

12. Как анализировать взаимоблокировку в Java

Тупик — это ситуация, когда несколько потоков ждут друг друга, чтобы освободить ресурсы, вызывая циклическую зависимость. В этой статье обсуждается ситуация, в которой мы можем получить взаимоблокировку в программе Java. Как мы можем использовать дамп потока, чтобы найти тупик и лучшие практики, чтобы избежать тупика в программе Java.

13. Поток таймера Java

В этом посте объясняется, как мы можем использовать классы Java Timer и TimerTask для создания заданий, которые будут выполняться с запланированным интервалом, пример программы, показывающий ее использование, и как мы можем отменить таймер.

14. Проблема производителя и потребителя Java

До появления Java 5 проблему производитель-потребитель можно было решить с помощью методов wait() и notify(), но введение BlockingQueue сделало это очень простым. Узнайте, как мы можем использовать BlockingQueue для решения проблемы производитель-потребитель в java.

15. Пул потоков Java

Java Thread Pool — это набор рабочих потоков, ожидающих обработки заданий. Введение в Java 5 среды Executor упростило создание пула потоков в java. Мы можем использовать классы Executors и ThreadPoolExecutor для создания пула потоков и управления им.

16. Вызываемое будущее Java

Иногда мы хотим, чтобы наш поток возвращал некоторые значения, которые мы можем использовать. В этом случае можно использовать Java 5 Callable, аналогичный интерфейсу Runnable. Мы можем использовать структуру Executor для выполнения вызываемых задач.

17. Пример Java FutureTask

Класс FutureTask — это базовый конкретный класс, реализующий интерфейс Future. Мы используем его с реализацией Callable и Executors для асинхронной обработки. Класс FutureTask предоставляет методы реализации для проверки состояния задачи и возврата значения вызывающей программе после завершения ее обработки. Это удобно, когда вы хотите переопределить некоторые методы реализации интерфейса Future.

Заключение

Многопоточность — очень обширная тема, и написать о ней все в одном посте было бы невозможно. Если вы прочитаете приведенные выше посты последовательно, вы узнаете все о многопоточности в Java.