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


93

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


В документации по 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();

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


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.