JavaRush /Java блог /Random UA /Кава-брейк #159. Життєвий цикл потоку в Java. Функціональ...

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

Стаття з групи Random UA

Життєвий цикл потоку в 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), що повертаються, є відповідними примітивами.
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ