JavaRush /Java блог /Random /Кофе-брейк #159. Жизненный цикл потока в Java. Функционал...

Кофе-брейк #159. Жизненный цикл потока в Java. Функциональные интерфейсы и методы по умолчанию в Java 8

Статья из группы Random

Жизненный цикл потока в Java

Источник: Medium Статья посвящена различным состояниям жизненного цикла потоков в Java. Кофе-брейк #159. Жизненный цикл потока в Java. Функциональные интерфейсы и методы по умолчанию в Java 8 - 1Жизненный цикл потока в Java в основном состоит из переходов в различные состояния, начиная с рождения потока (thread birth) и заканчивая его завершением (thread termination). Поток готов к запуску, когда он создается и запускается путем вызова метода start() в классе Thread. Когда из класса Thread вызывается метод sleep() или wait(), поток становится неработоспособным. Чтобы управлять потоками программно, важно идентифицировать состояние потока. Давайте разберемся, как жизненный цикл потока Java определяет его состояние. Вот что говорит на этот счет документация Java: Поток — это путь выполнения программы, который может войти в одно из пяти состояний в течение своего жизненного цикла:
  1. New
  2. Runnable
  3. Running
  4. Blocked
  5. Dead
1. New (новорожденное состояние, newborn state) возникает, когда вы создаете объект Thread в классе Thread. Поток создается и находится в “новорожденном” состоянии. То есть при возникновении потока он входит в новое состояние, но метод start() при этом еще не вызван для экземпляра. 2. Runnable. Это состояние означает, что поток готов к выполнению. Когда метод start() вызывается для нового потока, он становится готовым к запуску. В данном состоянии поток ожидает, пока процессор не станет доступным (CPU time, процессорное время). То есть поток становится в очередь (серию) потоков, ожидающих выполнения. 3. Running (состояние выполнения). Выполнение означает, что процессор выделил временной интервал для выполнения потока. Это состояние, в котором поток выполняет свою фактическую функцию. 4. Blocked (заблокированное состояние). Поток находится в заблокированном состоянии, когда он приостанавливается, спит или ждет некоторое время, чтобы удовлетворить поставленное условие. 5. Dead State. Это состояние возникает, когда метод run() завершает выполнение инструкций. Поток автоматически останавливается или переходит в мертвое состояние (Dead State). Иными словами, когда поток выходит из метода run(), он либо завершается, либо переходит в состояние dead.

Функциональные интерфейсы и методы по умолчанию в Java 8

Источник: Medium В этой статье вы узнаете о некоторых изменениях, впервые появившихся в Java 8, а именно о функциональных интерфейсах и методах по умолчанию.

Что такое методы по умолчанию (Default Methods)?

Мы знаем, что абстрактные классы могут иметь абстрактные и неабстрактные методы (методы, которые реализованы), но интерфейсы на 100% абстрактны (все эти методы имеют только сигнатуру и не имеют реализации). Но что если нам нужен интерфейс вместо класса и общая функциональность среди всех реализованных классов? Ведь тогда код реализации повторяется снова и снова в каждом классе, реализующем интерфейс. Чтобы избежать этого, в Java 8 добавили ключевое слово default. Если у нас есть метод, который реализован в интерфейсе, то этому методу должно быть присвоено ключевое слово default, а иначе мы получим ошибку времени выполнения.

Что такое функциональный интерфейс?

Функциональные интерфейсы — это не что иное, как интерфейсы с одним абстрактным методом и любым количеством стандартных или статических методов. Примером функционального интерфейса является Comparable, который имеет один абстрактный метод compareTo(). В свою очередь Runnable имеет метод run() и так далее. Мы также можем представить функциональный интерфейс с помощью аннотации @FunctionalInterface. Она гарантирует, что интерфейс имеет только один абстрактный метод:

@FunctionalInterface
public interface MyfunctionalInterface{
   public void myabstractmethod();
   public static void method1(){
       //Имплементация   
    }
   public default void method2(){
       //Имплементация    
    }
}

Типы функциональных интерфейсов

Consumer — принимает один аргумент и ничего не возвращает.
  • Три варианта Consumer — DoubleConsumer, IntConsumer и LongConsumer (в зависимости от типа аргументов, которые они принимают).
  • Bi-Consumer — принимает два аргумента и ничего не возвращает.
Predicate — принимает один аргумент и возвращает логическое значение.
  • Три варианта Predicate — DoublePredicate, IntPredicate и LongPredicate (в зависимости от типа аргументов, которые они принимают).
  • Bi-Predicate — принимает два аргумента и возвращает логическое значение.
Function — принимает один аргумент и возвращает одно значение.
  • Многие версии функций доступны как типы аргументов, такие как int, long и double, которые используются чаще всего.
  • Bi-Function — принимает два аргумента и возвращает одно значение.
  • Операторы Unary и Binary реализуют Function и Bi-Function соответственно, но дополнительным условием здесь является то, что ввод и вывод должны быть идентичными и одного типа.
Supplier — не принимает никаких входных данных, но возвращает одно значение. Различные версии Supplier: BooleanSupplier, IntSupplier, LongSupplier и DoubleSupplier, для которых возвращаемые типы (return types) являются соответствующими примитивами.
Комментарии (1)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
DmitryK #853142832 Уровень 26
6 марта 2023
Какая-то ерунда с состояниями потоков в статье. В спецификации java говорится про 6 состояний, а не 5, и среди них нет Running и Dead: - NEW - RUNNABLE - BLOCKED - WAITING - TIMED_WAITING - TERMINATED https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.State.html