Перейти к основному содержимому

· 6 мин. чтения

1. Обзор

Платформа fork/join была представлена в Java 7. Она предоставляет инструменты, помогающие ускорить параллельную обработку, пытаясь использовать все доступные процессорные ядра, что достигается с помощью подхода «разделяй и властвуй » .

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

После этого начинается часть «объединения» , в которой результаты всех подзадач рекурсивно объединяются в один результат, или в случае задачи, которая возвращает void, программа просто ждет, пока каждая подзадача будет выполнена.

Чтобы обеспечить эффективное параллельное выполнение, платформа fork/join использует пул потоков, называемый ForkJoinPool , который управляет рабочими потоками типа ForkJoinWorkerThread .

2. Вилка присоединения к пулу

· 9 мин. чтения

1. Обзор

В этом уроке мы узнаем о Future . Интерфейс, существующий со времен Java 1.5, может быть весьма полезен при работе с асинхронными вызовами и параллельной обработкой.

2. Создание фьючерсов

Проще говоря, класс Future представляет будущий результат асинхронного вычисления. Этот результат в конечном итоге появится в Будущем после завершения обработки.

Давайте посмотрим, как писать методы, которые создают и возвращают экземпляр Future .

· 6 мин. чтения

1. Обзор

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

В этом руководстве мы рассмотрим различные способы получения бита в определенной позиции из целочисленных значений, таких как byte , short , char , int и long .

2. Тестирование определенного бита

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

· 6 мин. чтения

1. Обзор

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

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

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

2. Графические средства мониторинга Java

· 4 мин. чтения

1. Обзор

В этом кратком руководстве мы узнаем о java.lang.IllegalMonitorStateException.

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

2. Когда его бросают?

Исключение IllegalMonitorStateException связано с многопоточным программированием в Java. Если у нас есть монитор , на котором мы хотим синхронизироваться, это исключение генерируется, чтобы указать, что поток пытался ждать или уведомить другие потоки, ожидающие на этом мониторе, не владея им. Проще говоря, мы получим это исключение, если вызовем один из методов wait() , notify( ) или notifyAll() класса Object за пределами синхронизированного блока.

· 3 мин. чтения

1. Введение

Прежде чем мы представили потокобезопасность и способы ее достижения .

В этой статье мы рассмотрим локальные переменные и почему они потокобезопасны.

2. Память стека и потоки

Начнем с краткого обзора модели памяти JVM.

· 4 мин. чтения

1. Введение

В этом руководстве мы обсудим причину и возможные способы устранения ошибки java.lang.OutOfMemoryError: невозможно создать новый собственный поток .

2. Понимание проблемы

2.1. Причина проблемы

· 5 мин. чтения

1. Обзор

В этой статье мы рассмотрим конструкцию Phaser из пакета java.util.concurrent . Это очень похожая конструкция на CountDownLatch , которая позволяет нам координировать выполнение потоков. По сравнению с CountDownLatch имеет некоторые дополнительные функции.

Phaser — это барьер, на котором динамическое количество потоков должно ждать, прежде чем продолжить выполнение. В CountDownLatch это число нельзя настроить динамически, и его необходимо указать при создании экземпляра.

2. Фазер API

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

· 2 мин. чтения

1. Введение

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

В этом уроке мы рассмотрим Quasar, одну из таких библиотек, которая предлагает поддержку совместных программ.

2. Настройка

Мы будем использовать последнюю версию Quasar, для которой требуется Java 11 или выше. Но пример приложения также будет работать с предыдущими версиями Quasar, совместимыми с Java 7 и 8.

· 6 мин. чтения

1. Обзор

Executor Framework в Java — это попытка отделить отправку задачи от выполнения задачи. Хотя этот подход очень хорошо абстрагирует детали выполнения задачи, иногда нам все же нужно настроить его для еще более оптимального выполнения.

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

2. Пересмотр пулов потоков

На следующей диаграмме показано, как служба исполнителя работает внутри: