powiedzmy, że mam metodę doWork()
. Jak mam to nazwać z osobnego wątku (nie głównego wątku).
java
multithreading
Louis Rhys
źródło
źródło
Odpowiedzi:
Utwórz klasę, która implementuje
Runnable
interfejs. Umieść kod, który chcesz uruchomić wrun()
metodzie - to metoda, którą musisz napisać, aby była zgodna zRunnable
interfejsem. W swoim "głównym" wątku utwórz nowąThread
klasę, przekazując konstruktorowi twoją instancjęRunnable
, a następnie wywołajstart()
ją.start
mówi JVM, aby wykonał magię, aby utworzyć nowy wątek, a następnie wywołaćrun
metodę w tym nowym wątku.Spójrz na samouczku współbieżności Java , aby zacząć.
Jeśli twoja metoda będzie często wywoływana, może nie być warto tworzyć za każdym razem nowego wątku, ponieważ jest to kosztowna operacja. Prawdopodobnie najlepiej byłoby użyć jakiejś puli wątków. Przyjrzeć się
Future
,Callable
,Executor
klas wjava.util.concurrent
pakiecie.źródło
run()
Metoda bierze żadnych parametrów, więc nie można przekazać nie zmienną. Proponuję przekazać to w konstruktorze - edytuję swoją odpowiedź, aby to pokazać.new Thread() { public void run() {myMethod();}}.start();
drogę, czy to najkrótsza?Runnable
- moja to klasa, która rozszerzaRunnable
. A ponieważ już to zrobiłem, mam swój własny konstruktor, który przekazuje stan do instancji obiektu.lub
lub
lub
lub
źródło
run()
?W Javie 8 możesz to zrobić za pomocą jednej linii kodu.
Jeśli Twoja metoda nie przyjmuje żadnych parametrów, możesz użyć odwołania do metody:
W przeciwnym razie możesz wywołać metodę w wyrażeniu lambda:
źródło
->
oznacza?Celery task queue
do rzeczy asynchronicznychInną szybszą opcją do wywoływania rzeczy (takich jak DialogBox i MessageBox oraz tworzenie oddzielnych wątków dla metod niegwątkowych) byłoby użycie wyrażenia Lamba
źródło
Jakiś czas temu napisałem prostą klasę narzędziową, która korzysta z usługi wykonawczej JDK5 i wykonuje określone procesy w tle. Ponieważ doWork () zazwyczaj ma wartość zwracaną przez void, możesz chcieć użyć tej klasy narzędziowej, aby wykonać ją w tle.
Zobacz ten artykuł, w którym udokumentowałem to narzędzie.
źródło
Aby to osiągnąć z RxJava 2.x, możesz użyć:
Te
subscribeOn()
określa, które scheduler metoda uruchomić akcję na - RxJava ma kilka predefiniowanych wyłącznika, tymSchedulers.io()
który posiada gwint basen przeznaczony dla I / O operacji, iSchedulers.computation()
który jest przeznaczony do intensywnej pracy procesora.źródło
Jeśli używasz przynajmniej Java 8, możesz użyć metody
runAsync
z klasy CompletableFutureJeśli chcesz zwrócić wynik, użyj
supplyAsync
zamiast tegoźródło