java.lang.Runnable це інтерфейс, який має бути реалізований класом, екземпляри якого призначені для виконання потоком. Є два способи запустити новий Thread - Subclass Thread і реалізувати Runnable. Немає необхідності створювати підклас Thread, якщо завдання можна виконати шляхом перевизначення лише запустити() метод Runnable.
Кроки для створення нового потоку за допомогою Runnable
- Створіть реалізатор Runnable і реалізуйте метод run().
- Створіть екземпляр класу Thread і передайте реалізатор Thread Thread має конструктор, який приймає екземпляри Runnable.
- Виклик 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 автоматично.
Створіть вікторину