У простому для розуміння поясненні, що таке Runnable в Java? [зачинено]


92

Що означає "запустити" на Java, неспеціалістично? Я студент з програмування AP у середній школі, завдання якого - дослідити або розшукати у інших, що таке "керований" (ми тільки вступаємо в ООП, і ще не торкалися тем).


У документах API є лише один корисний рядок: "Загальний договір запуску методу полягає в тому, що він може вжити будь-які дії".
Том Хоутін - таклін

Набагато цікавішим завданням дослідження було б: Що "зупинити" в Java, неспеціалістом. Сьогоднішні інструктори такі ...
Удо Клімашевський

9
@UdoKlimaschewski - хлопець є старшокласником , а не студентом та аспірантом. Очікування цього викладача співмірні з рівнем студентського ... IMO. Однак я погоджуюсь з тим, що "перше запитання щодо ТО" НЕ є належною технікою дослідження для когось на рівні ОП.
Stephen C

Відповіді:


189

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 {

Його можна використовувати, навіть не створюючи нової нитки. Це в основному ваш базовий інтерфейс з одним методом, запуском, який можна викликати.

Якщо ви зробите новий Thread із запущеним параметром, він викличе метод run у новому Thread.

Слід також зазначити, що Threads реалізуються Runnable, і це викликається при створенні нової Thread (у новому потоці). Реалізація за замовчуванням просто викликає будь-який 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.