Давайте подивимось на наступний код, він працює точно.
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();
}
}
Він чудово працює і відображає повідомлення Хіба це не здорово? на консолі. Питання тут лише в тому, чому інтерфейс Runnable не повинен бути реалізований класом DemoThread?
Відповіді:
5 за відповідь № 1Runnable
реалізується анонімний внутрішній клас в межах 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 ?" ) ;
}
}
}
Це робить це для вас зрозумілішим?
3 для відповіді № 2
DemoThread
насправді нічого не робить з Thread
себе. Це нерест нового Thread
який обертається навколо анонімного класу, який реалізує Runnable
.
new Runnable()
{
public void run()
{
System.out.println( "Isn"t it great ?" ) ;
}
}
Створює новий клас. Ви побачите це у файловій системі під час запуску javac.
2 для відповіді № 3
Що має реалізувати інтерфейс Runnable - це об'єкт, який ви передаєте як параметр об'єкту Thread, що і буде виконано.
У вашому випадку ви вже оголосили анонімний клас, який реалізує Runnable, який передається об'єкту Thread.
new Thread(new Runnable() // <--- This is the class that"s implementing Runnable
{
public void run()
{
System.out.println( "Isn"t it great ?" ) ;
}
} ) .start() ;