W prostym wyjaśnieniu, co to jest Runnable w Javie? [Zamknięte]
93
Co jest „uruchamialne” w Javie, w kategoriach laika? Jestem studentem programowania AP w liceum, którego zadaniem jest zbieranie informacji lub szukanie od innych tego, czym jest „runnable” (dopiero wchodzimy do OOP i jeszcze nie poruszyliśmy wątków).
W dokumentacji API jest tylko jeden użyteczny wiersz: „Ogólny kontrakt uruchamianej metody jest taki, że może ona wykonać dowolną akcję”.
Tom Hawtin - tackline
O wiele ciekawsze zadanie badawcze brzmiałoby: Co można „zatrzymać” w Javie, w kategoriach laika. Dzisiejsi Instruktorzy są tacy ...
Udo Klimaschewski
9
@UdoKlimaschewski - facet jest licealistą , a nie studentem studiów licencjackich czy podyplomowych. Oczekiwania tego instruktora są współmierne do poziomu ucznia ... IMO. Zgadzam się jednak, że „pierwsze pytanie na SO” NIE jest właściwą techniką badawczą dla kogoś na poziomie PO.
Stephen C
Odpowiedzi:
189
Runnable to w zasadzie typ klasy (Runnable to interfejs), którą można umieścić w wątku, opisując, co ten wątek ma robić.
publicclassMyRunnableTaskimplementsRunnable{
publicvoidrun(){
// do stuff here
}
}
A potem użyj tego w ten sposób:
Thread t = new Thread(new MyRunnableTask());
t.start();
Gdybyś nie miał Runnableinterfejsu, klasa Thread, która jest odpowiedzialna za wykonywanie twoich rzeczy w innym wątku, nie miałaby obietnicy znalezienia run()metody w twojej klasie, więc możesz uzyskać błędy. Dlatego musisz zaimplementować interfejs.
Zaawansowany: typ anonimowy
Pamiętaj, że nie musisz jak zwykle definiować klasy, możesz to wszystko zrobić w tekście:
Thread t = new Thread(new Runnable() {
publicvoidrun(){
// stuff here
}
});
t.start();
Jest to podobne do powyższego, z tą różnicą, że nie tworzysz kolejnej nazwanej klasy.
To świetna odpowiedź, która całkowicie obala twierdzenie, że na pytanie „nie można odpowiedzieć rozsądnie w obecnej formie”.
Russell Silva
1
Wiem, że minęło dużo czasu, ale mam pytanie. Wątek jest uruchamiany tylko raz, czy po prostu działa w kółko w programie, gdy uruchamiam wątek?
gamo
5
Wątek jest uruchamiany do zakończenia runmetody, a następnie Thread zostanie zamknięty. Jeśli chcesz, aby wątek działał w kółko, umieść pętlę wewnątrz runmetody.
opatut
2
Lub po prostu używając funkcji lambda Java 8:new Thread(() -> System.out.println("hello from other thread")).start();
Gabe,
9
Runnable jest interfejsem zdefiniowanym następująco:
interfaceRunnable{
publicvoidrun();
}
Aby utworzyć klasę, która go używa, po prostu zdefiniuj ją jako (public) class MyRunnable implements Runnable {
Można go używać nawet bez tworzenia nowego wątku. Jest to w zasadzie twój podstawowy interfejs z jedną metodą, uruchom, którą można wywołać.
Jeśli utworzysz nowy wątek z runnable jako parametrem, wywoła on metodę run w nowym Thread.
Należy również zauważyć, że Threads implementuje Runnablei jest wywoływana, gdy nowy wątek jest tworzony (w nowym wątku). Domyślna implementacja po prostu wywołuje wszystko, co Runnable przekazałeś w konstruktorze, dlatego możesz po prostu obejść się new Thread(someRunnable)bez nadpisywania runmetody Thread .
Czy twierdzisz, że w zasadzie nie ma różnicy między dziedziczeniem Thread a implementacją Runnable? Czy Thread, gdy używasz Runnable, jest używany jako opakowanie, a także jako moduł wykonawczy?
opatut
Mówię, że nie ma różnicy między [rozszerzaniem Thread i nadpisywaniem uruchomienia] a [tworzeniem nowej instancji Thread z plikiem uruchomieniowym, który ma tę samą metodę uruchamiania]
Alex Coleman.
Tak, rozumiem. Ale czy naprawdę nie ma różnicy, ani wydajności - ani inaczej?
opatut
3
@AlexColeman - jest duża różnica. Jeśli rozszerzysz Threadpulę wątków, jest to trudne i jeśli nie zaimplementujesz puli wątków, przez cały czas będziesz ponosić znaczne koszty tworzenia nowych wątków. Natomiast samo wdrożenie Runnableoznacza, że możesz łatwo korzystać z takich rzeczy, jak ThreadPoolExecutorServicepula wątków innej firmy.
Odpowiedzi:
Runnable to w zasadzie typ klasy (Runnable to interfejs), którą można umieścić w wątku, opisując, co ten wątek ma robić.
Runnable Interfejs wymaga klasy wdrożyć metodę
run()
tak:public class MyRunnableTask implements Runnable { public void run() { // do stuff here } }
A potem użyj tego w ten sposób:
Thread t = new Thread(new MyRunnableTask()); t.start();
Gdybyś nie miał
Runnable
interfejsu, klasa Thread, która jest odpowiedzialna za wykonywanie twoich rzeczy w innym wątku, nie miałaby obietnicy znalezieniarun()
metody w twojej klasie, więc możesz uzyskać błędy. Dlatego musisz zaimplementować interfejs.Zaawansowany: typ anonimowy
Pamiętaj, że nie musisz jak zwykle definiować klasy, możesz to wszystko zrobić w tekście:
Thread t = new Thread(new Runnable() { public void run() { // stuff here } }); t.start();
Jest to podobne do powyższego, z tą różnicą, że nie tworzysz kolejnej nazwanej klasy.
źródło
run
metody, a następnie Thread zostanie zamknięty. Jeśli chcesz, aby wątek działał w kółko, umieść pętlę wewnątrzrun
metody.new Thread(() -> System.out.println("hello from other thread")).start();
Runnable
jest interfejsem zdefiniowanym następująco:interface Runnable { public void run(); }
Aby utworzyć klasę, która go używa, po prostu zdefiniuj ją jako
(public) class MyRunnable implements Runnable {
Można go używać nawet bez tworzenia nowego wątku. Jest to w zasadzie twój podstawowy interfejs z jedną metodą, uruchom, którą można wywołać.
Jeśli utworzysz nowy wątek z runnable jako parametrem, wywoła on metodę run w nowym Thread.
Należy również zauważyć, że Threads implementuje
Runnable
i jest wywoływana, gdy nowy wątek jest tworzony (w nowym wątku). Domyślna implementacja po prostu wywołuje wszystko, co Runnable przekazałeś w konstruktorze, dlatego możesz po prostu obejść sięnew Thread(someRunnable)
bez nadpisywaniarun
metody Thread .źródło
Thread
pulę wątków, jest to trudne i jeśli nie zaimplementujesz puli wątków, przez cały czas będziesz ponosić znaczne koszty tworzenia nowych wątków. Natomiast samo wdrożenieRunnable
oznacza, że możesz łatwo korzystać z takich rzeczy, jakThreadPoolExecutorService
pula wątków innej firmy.