Простой сценарий потока в Java, где исполняемый интерфейс не обязательно должен быть реализован классом, реализующим поток

#java

#java

Вопрос:

Давайте посмотрим на следующий код, он точно работает.

 final class DemoThread
{
    public void temp()
    {
        new Thread(new Runnable()
        {
            public void run()
            {
                System.out.println( "Isn't it great ?" ) ;
            }
        } ) .start() ;
    }
}

final public class Main
{
    public static void main(String[] args)
    { 
        new DemoThread().temp();
    }
}
  

Он отлично работает и отображает сообщение Разве это не здорово? на консоли. Единственный вопрос здесь заключается в том, почему выполняемый интерфейс не обязательно должен быть реализован классом DemoThread?

Ответ №1:

Runnable реализуется анонимным внутренним классом внутри temp метода:

 new Thread(new Runnable()
{
    public void run()
    {
        System.out.println( "Isn't it great ?" ) ;
    }
} ) .start() ;
  

Учитывая, что экземпляр DemoThread не передается в Thread конструктор, независимо от того, реализует он Runnable или нет, полностью ортогонально тому, как выполняется поток.

Ваш код похож на этот:

 final class DemoThread
{
    public void temp()
    {
        new Thread(new Anonymous()).start();
    }

    private class Anonymous implements Runnable
    {
        public void run()
        {
            System.out.println( "Isn't it great ?" ) ;
        }
    }
}
  

Это делает его более понятным для вас?

Ответ №2:

DemoThread на самом деле ничего не делает с Thread самим собой. Он порождает новый, Thread который обернут вокруг анонимного класса, который реализует Runnable .

 new Runnable()
{
    public void run()
    {
        System.out.println( "Isn't it great ?" ) ;
    }
}
  

Создает новый класс. Вы увидите это в файловой системе при запуске javac.

Ответ №3:

Что должно реализовать исполняемый интерфейс, так это объект, который вы передаете в качестве параметра объекту потока, который и будет выполняться.

В вашем случае вы уже объявили анонимный класс, который реализует Runnable, который передается объекту потока.

 new Thread(new Runnable()   // <--- This is the class that's implementing Runnable
        {
            public void run()
            {
                System.out.println( "Isn't it great ?" ) ;
            }
        } ) .start() ;