java.lang.Runnable este o interfață care urmează să fie implementată de o clasă ale cărei instanțe sunt destinate să fie executate de un fir. Există două moduri de a începe un nou Thread - Subclasă Thread și de a implementa Runnable. Nu este nevoie să subclasați un Thread atunci când o sarcină poate fi realizată prin suprascrierea numai a alerga() metoda Runnable.
Pași pentru a crea un nou thread folosind Runnable
- Creați un implementator Runnable și implementați metoda run().
- Instanțiați clasa Thread și transmiteți implementatorul Thread Thread are un constructor care acceptă instanțe Runnable.
- Invocă start() al instanței Thread start, apelează intern run() al implementatorului.
- Invocarea start() creează un nou Thread care execută codul scris în run().
- Apelarea directă a run() nu creează și nu pornește un nou Thread, acesta va rula în același thread.
- Pentru a începe o nouă linie de execuție, apelați start() pe fir.
Exemplu:
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(); } }
Ieșire
Main thread is: main Thread-0 executing run() method!
Explicaţie: Ieșirea arată două fire active în program - firul principal și metoda principală Thread-0 este executată de firul principal, dar invocarea pornirii pe RunnableImpl creează și pornește un fir nou - Thread-0.
șir de date java
Gestionarea excepției în Runnable
Interfața rulabilă nu poate arunca excepții bifate, dar RuntimeException poate fi aruncată din run(). Excepțiile neprinse sunt gestionate de handler-ul de excepții al firului de execuție, dacă JVM nu poate gestiona sau prinde excepții, imprimă urmărirea stivei și încheie fluxul.
Exemplu:
buclă for în javajava
// 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(); } }
Ieșire:
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)
Explicaţie : Rezultatul arată că Runnable nu poate arunca excepții verificate FileNotFoundException în acest caz, pentru apelanți, trebuie să gestioneze excepțiile verificate în run(), dar RuntimeExceptions (aruncate sau generate automat) sunt gestionate automat de JVM.
Creați un test