В просто разбираемо обяснение какво е Runnable в Java? [затворено]

Какво е "runnable" в Java, казано на лаик? Аз съм студент по AP програмиране в гимназията, чиято задача е да правя изследвания или да търся от другите какво е „runnable“ (ние просто навлизаме в ООП и все още не сме докоснали нишки).


person user1809295    schedule 11.11.2012    source източник
comment
Има само един полезен ред в API документите: Общият договор на изпълнението на метода е, че той може да предприеме каквото и да е действие.   -  person Tom Hawtin - tackline    schedule 11.11.2012
comment
Много по-интересна изследователска задача би била: Какво може да бъде спряно в Java, казано на лаик. Днешните инструктори са толкова...   -  person Udo Klimaschewski    schedule 11.11.2012
comment
@UdoKlimaschewski - човекът е гимназистученик, а не студент или следдипломен студент. Очакванията на този инструктор са съизмерими с нивото на ученика ... IMO. Съгласен съм обаче, че първо питане за SO НЕ е подходяща изследователска техника за някой на ниво OP.   -  person Stephen C    schedule 11.11.2012


Отговори (2)


Runnable е основно тип клас (Runnable е интерфейс), който може да бъде поставен в нишка, описвайки какво трябва да прави нишката.

Runnable Interface изисква от класа да имплементира метода 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 като параметър, тя ще извика метода за изпълнение в нова нишка.

Трябва също да се отбележи, че Threads имплементират 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
Казвам, че няма разлика между [разширяване на Thread и замяна на изпълнение] и [създаване на нов екземпляр на Thread с runnable, който има същия метод на изпълнение] - person Alex Coleman; 11.11.2012
comment
Да разбрах. Но наистина ли няма разлика, нито в производителността, нито по друг начин? - person opatut; 11.11.2012
comment
@AlexColeman - има голяма разлика. Ако разширите Thread обединяването на нишки е трудно и ако не внедрите обединяване на нишки, вие носите значителните разходи за създаване на нови нишки през цялото време. За разлика от това, просто внедряването на Runnable означава, че можете лесно да използвате неща като ThreadPoolExecutorService или пул от нишки на трета страна. - person Stephen C; 11.11.2012