#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() ;