У простому для розуміння поясненні, що таке 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.