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

93

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

user1809295
источник
В документации по API есть только одна полезная строчка: «Общий принцип выполнения метода заключается в том, что он может предпринимать любые действия».
Tom Hawtin - tackline
Гораздо более интересной исследовательской задачей было бы: что "можно остановить" в Java, с точки зрения непрофессионала. Сегодняшние инструкторы такие ...
Удо Климащевски
9
@UdoKlimaschewski - этот парень учится в старшей школе , а не на бакалавриате или аспирантуре. Ожидания этого инструктора соизмеримы с уровнем студента ... ИМО. Тем не менее, я согласен с тем, что «сначала спросите SO» НЕ является подходящей техникой исследования для кого-то на уровне OP.
Stephen C

Ответы:

190

Runnable - это, по сути, тип класса (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();

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

Opatut
источник
68
Это отличный ответ, который полностью опровергает утверждение о том, что на вопрос «нельзя разумно ответить в его нынешней форме».
Рассел Сильва,
1
Я знаю, что это было давно, но у меня есть вопрос. Поток запускается только один раз или просто запускается снова и снова внутри программы, когда я запускаю поток?
gamo
5
Поток выполняется до завершения runметода, затем поток закрывается. Если вы хотите, чтобы поток запускался снова и снова, поместите цикл внутри runметода.
opatut
2
Или просто используя лямбда-функцию Java 8:new Thread(() -> System.out.println("hello from other thread")).start();
Гейб
9

Runnable это интерфейс, определенный так:

interface Runnable {
    public void run();
}

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

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

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

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

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