logo

Java Runnable Interface

java.lang.Runnable це інтерфейс, який має бути реалізований класом, екземпляри якого призначені для виконання потоком. Є два способи запустити новий Thread - Subclass Thread і реалізувати Runnable. Немає необхідності створювати підклас Thread, якщо завдання можна виконати шляхом перевизначення лише запустити() метод Runnable. 

Кроки для створення нового потоку за допомогою Runnable 

  1. Створіть реалізатор Runnable і реалізуйте метод run(). 
  2. Створіть екземпляр класу Thread і передайте реалізатор Thread Thread має конструктор, який приймає екземпляри Runnable.
  3. Виклик start() екземпляра Thread start внутрішньо викликає run() реалізатора.
    • Виклик start() створює новий потік, який виконує код, написаний у run().
    • Безпосередній виклик run() не створює та не запускає новий потік, він виконуватиметься в тому самому потоці.
    • Щоб почати новий рядок виконання, викликайте start() у потоці. 

приклад:

java
// Runnable Interface Implementation public class Geeks  {  private class RunnableImpl implements Runnable   {  // Overriding the run Method  @Override  public void run()  {  System.out.println(Thread.currentThread().getName()  + ' executing run() method!');  }  }     // Main Method  public static void main(String[] args)   {   System.out.println('Main thread is: '  + Thread.currentThread().getName());    // Creating Thread  Thread t1 = new Thread(new Geeks().new RunnableImpl());    // Executing the Thread  t1.start();  } } 

Вихід
Main thread is: main Thread-0 executing run() method! 

Пояснення: Вихідні дані показують два активних потоки в програмі — основний потік і головний метод Thread-0 виконується основним потоком, але виклик запуску RunnableImpl створює та запускає новий потік — Thread-0.



діаграма класів java

Обробка винятків у Runnable

Runnable інтерфейс не може викинути перевірений виняток, але RuntimeException може бути викинуто з run(). Неперехоплені винятки обробляються обробником винятків потоку, якщо JVM не може обробити або перехопити винятки, він друкує трасування стека та завершує потік. 

приклад:

java case оператор
java
// Checking Exceptions in Runnable Interface import java.io.FileNotFoundException; public class Geeks {  private class RunnableImpl implements Runnable   {  // Overriding the run method   @Override  public void run()  {  System.out.println(Thread.currentThread().getName()  + ' executing run() method!');    // Checked exception can't be thrown Runnable must  // handle checked exception itself  try {  throw new FileNotFoundException();  }  catch (FileNotFoundException e) {  System.out.println('Must catch here!');  e.printStackTrace();  }  int r = 1 / 0;    // Below commented line is an example  // of thrown RuntimeException.    // throw new NullPointerException();  }  }    public static void main(String[] args)  {  System.out.println('Main thread is: ' +  Thread.currentThread().getName());     // Create a Thread  Thread t1 = new Thread(new Geeks().new RunnableImpl());    // Running the Thread  t1.start();  } } 

Вихід:

Thread-0 executing run() method!  
Must catch here!
java.io.FileNotFoundException
at RunnableDemo$RunnableImpl.run(RunnableDemo.java:25)
at java.lang.Thread.run(Thread.java:745)
Exception in thread 'Thread-0' java.lang.ArithmeticException: / by zero
at RunnableDemo$RunnableImpl.run(RunnableDemo.java:31)
at java.lang.Thread.run(Thread.java:745)

Пояснення : результат показує, що Runnable не може генерувати перевірені винятки FileNotFoundException у цьому випадку для абонентів він повинен обробляти перевірені винятки в run(), але RuntimeExceptions (викинуті або автоматично згенеровані) обробляються JVM автоматично.

Створіть вікторину