В простом для понимания объяснении, что такое Runnable в Java?

Что такое «запускаемый» в Java, с точки зрения непрофессионала? Я изучаю программирование AP в старшей школе, чье задание состоит в том, чтобы проводить исследования или выяснять у других, что такое «работоспособный» (мы только начинаем заниматься ООП и еще не касались потоков).


person user1809295    schedule 11.11.2012    source источник
comment
В документах API есть только одна полезная строка: общий контракт метода run заключается в том, что он может предпринимать любые действия.   -  person Tom Hawtin - tackline    schedule 11.11.2012
comment
Гораздо более интересной исследовательской задачей было бы: Что можно остановить в Java, с точки зрения непрофессионала. Нынешние инструкторы такие...   -  person Udo Klimaschewski    schedule 11.11.2012
comment
@UdoKlimaschewski - этот парень учится старшеклассником, а не студентом или аспирантом. Ожидания этого инструктора соизмеримы с уровнем ученика... ИМО. Тем не менее, я согласен с тем, что первый вопрос о SO НЕ является подходящим методом исследования для кого-то на уровне OP.   -  person Stephen C    schedule 11.11.2012


Ответы (2)


Runnable — это в основном тип класса (Runnable — это интерфейс), который можно поместить в поток, описывая, что поток должен делать.

Выполняемый интерфейс требует от класса реализации метода run() следующим образом :

public class MyRunnableTask implements Runnable {
     public void run() {
         // do stuff here
     }
}

А затем используйте его следующим образом:

Thread t = new Thread(new MyRunnableTask());
t.start();

Если бы у вас не было интерфейса Runnable, у класса Thread, отвечающего за выполнение ваших действий в другом потоке, не было бы обещания найти метод run() в вашем классе, поэтому вы могли бы получить ошибки. Вот почему вам нужно реализовать интерфейс.

Дополнительно: анонимный тип

Обратите внимание, что вам не нужно определять класс, как обычно, вы можете сделать все это встроенным:

Thread t = new Thread(new Runnable() {
    public void run() {
        // stuff here
    }
});
t.start();

Это похоже на предыдущее, только вы не создаете еще один именованный класс.

person opatut    schedule 11.11.2012
comment
Это отличный ответ, который полностью опровергает утверждение о том, что на вопрос нельзя дать разумный ответ в его нынешнем виде. - person Russell Silva; 23.09.2013
comment
Я знаю, что это было давно, но у меня есть вопрос. Поток запускается только один раз или просто продолжает работать снова и снова внутри программы, когда я запускаю поток? - person gamo; 19.11.2014
comment
Поток выполняется до тех пор, пока метод run не завершится, после чего поток закрывается. Если вы хотите, чтобы поток выполнялся снова и снова, поместите цикл внутри метода run. - person opatut; 20.11.2014
comment
Или просто используя лямбда-функцию Java 8: new Thread(() -> System.out.println("hello from other thread")).start(); - person Gabe; 16.10.2018

Runnable — это интерфейс, определенный следующим образом:

interface Runnable {
    public void run();
}

Чтобы создать класс, который его использует, просто определите класс как (public) class MyRunnable implements Runnable {

Его можно использовать, даже не создавая новый поток. По сути, это ваш базовый интерфейс с единственным методом run, который можно вызвать.

Если вы создадите новый поток с runnable в качестве параметра, он вызовет метод запуска в новом потоке.

Следует также отметить, что потоки реализуют Runnable, и это вызывается при создании нового потока (в новом потоке). Реализация по умолчанию просто вызывает любой Runnable, который вы передали конструктору, поэтому вы можете просто выполнить new Thread(someRunnable) без переопределения метода run Thread.

person Alex Coleman    schedule 11.11.2012
comment
Вы говорите, что в принципе нет разницы между наследованием Thread и реализацией Runnable? Используется ли Thread при использовании Runnable в качестве оболочки, а также исполнителя? - person opatut; 11.11.2012
comment
Я говорю, что нет никакой разницы между [расширением потока и переопределением запуска] и [созданием нового экземпляра потока с исполняемым объектом, имеющим тот же метод запуска] - person Alex Coleman; 11.11.2012
comment
Да понял. Но неужели нет никакой разницы, ни производительности, ни прочего? - person opatut; 11.11.2012
comment
@AlexColeman - есть большая разница. Если вы расширяете Thread пул потоков, это сложно, и если вы не реализуете пулы потоков, вы несете значительные затраты на постоянное создание новых потоков. Напротив, простая реализация Runnable означает, что вы можете легко использовать такие вещи, как ThreadPoolExecutorService или сторонний пул потоков. - person Stephen C; 11.11.2012