logo

Java Runnable интерфейс

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

Стъпки за създаване на нова нишка с помощта на Runnable 

  1. Създайте Runnable имплементатор и имплементирайте метода run(). 
  2. Създайте екземпляр на класа Thread и предайте имплементатора към Thread Thread има конструктор, който приема Runnable екземпляри.
  3. Invoke start() на Thread instance 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.



синхронизиране на нишки

Обработка на изключение в Runnable

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

Пример:

възраст на ритик рошан
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.

Създаване на тест