Как вообще может работать класс Runnable?

Рейтинг: 0Ответов: 2Опубликовано: 08.09.2014

Мне тут стало интересно, что же представляет из себя интерфейс Runnable. Честно сказать, я удивлен. Вот весь его код:

public interface Runnable {
    public abstract void run();
}

Но я ведь тоже могу написать такой интерфейс:

public interface NewThread {
    public abstract void go();
}

Но он не будет работать (или будет?). Объясните, пожалуйста, как же это все работает?

Ответы

▲ 5Принят

Вся магия расположена в классе Thread. Он реализует всё, что нужно, и ему только надо запустить какой-то код. Как ему это сделать?

С лямбдами сейчас проще — передали лямбду без аргументов и без возвращаемого значения, и её можно запускать. А что делать было до Java 8? Нужно что-то запустить. Что это может быть в принципе? Поскольку функцию в thread невозможно, можно передать только экземпляр класса (в Java всё — классы, помните?). А как гарантировать, что у этого класса будет метод без аргументов и без возвращаемого значения?

Разные языки подходят по-разному. Некоторые используют duck typing: пусть в классе будет один метод, его и запускать. Или передача по имени: передать ещё и имя метода, его и запускать. Но эти методы очень не в духе Java: duck typing не используется в Java нигде, а рефлексия не гарантирует, что скомпилированный код будет работать.

А вот интерфейс — хорошее решение. Но какой интерфейс использовать? Взять готовый — ну так у интерфейса должен быть смысл. Вот и придумали интерфейс Runnable: он лишь декларирует, что у класса есть метод run. Его thread и запустит.

Если вы напишете свой интерфейс, откуда thread о нём узнает? Поэтому-то ваш аналог Runnable и не проходит. Хотя в принципе ничего не мешало бы, будь система типов Java structural, а не nominal (как это по-русски?).


Короче: разработчикам Java нужен был какой-то путь убедиться, что у переданного класса есть метод без аргументов и возвращаемого значения. Вот они чисто формально и определили интерфейс. «Особость» этого интерфейса только в том, что о нём знает Thread, и берёт из него метод.

▲ 3

Поскольку комментарии кончились, отвечаю здесь.

нет, я хочу понять, где прописано, что именно интерфейс с названием Runnable должен вызывать дополнительный поток. Ведь это где-то прописано?

Я так понимаю, речь идёт о java.lang.Thread? Ну так в его сорцы и посмотрите. Всё же просто. Наслаждайтесь.