java.lang.Runnable je rozhraní, které má být implementováno třídou, jejíž instance mají být spouštěny vláknem. Existují dva způsoby, jak spustit nové vlákno - Subclass Thread a implementovat Runnable. Není potřeba podtřídu vlákna, když lze úlohu provést pouze přepsáním běh() metoda Runnable.
Kroky k vytvoření nového vlákna pomocí Runnable
- Vytvořte implementátor Runnable a implementujte metodu run().
- Vytvořte instanci třídy Thread a předejte implementátor do Thread Thread má konstruktor, který přijímá Runnable instance.
- Invoke start() instance Thread start interně volá run() implementátoru.
- Vyvoláním start() se vytvoří nové vlákno, které spustí kód napsaný v run().
- Přímé volání run() nevytvoří a nespustí nové vlákno, které poběží ve stejném vláknu.
- Chcete-li zahájit nový řádek provádění, zavolejte start() ve vláknu.
Příklad:
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(); } }
Výstup
Main thread is: main Thread-0 executing run() method!
Vysvětlení: Výstup zobrazuje dvě aktivní vlákna v programu - hlavní vlákno a hlavní metodu Thread-0 provádí hlavní vlákno, ale vyvoláním spuštění na RunnableImpl se vytvoří a spustí nové vlákno - Thread-0.
vracející pole v Javě
Výjimka zpracování v Runnable
Runnable rozhraní nemůže vyvolat zaškrtnutou výjimku, ale RuntimeException lze vyvolat z run(). Nezachycené výjimky zpracovává obslužná rutina výjimek vlákna, pokud JVM nemůže zpracovat nebo zachytit výjimky, vytiskne trasování zásobníku a ukončí tok.
Příklad:
js splicejava
// 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(); } }
výstup:
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)
Vysvětlení : Výstup ukazuje, že Runnable nemůže vyvolat zaškrtnuté výjimky FileNotFoundException v tomto případě pro volající musí zpracovat zaškrtnuté výjimky v run(), ale RuntimeExceptions (vyhozené nebo automaticky generované) jsou zpracovávány JVM automaticky.
Vytvořit kvíz