Nehmen wir an, ich habe eine Methode doWork()
. Wie rufe ich es von einem separaten Thread auf (nicht vom Haupt-Thread)?
java
multithreading
Louis Rhys
quelle
quelle
Antworten:
Erstellen Sie eine Klasse, die die
Runnable
Schnittstelle implementiert . Fügen Sie den Code, den Sie ausführen möchten, in dierun()
Methode ein - das ist die Methode, die Sie schreiben müssen, um derRunnable
Schnittstelle zu entsprechen . Erstellen Sie in Ihrem "Haupt" -Thread eine neueThread
Klasse, übergeben Sie dem Konstruktor eine Instanz von IhnenRunnable
und rufen Siestart()
sie dann auf.start
Weist die JVM an, die Magie auszuführen, um einen neuen Thread zu erstellen, und dann Ihrerun
Methode in diesem neuen Thread aufzurufen .Schauen Sie sich das Parallelitäts-Tutorial von Java an, um loszulegen.
Wenn Ihre Methode häufig aufgerufen wird, lohnt es sich möglicherweise nicht, jedes Mal einen neuen Thread zu erstellen, da dies eine teure Operation ist. Es wäre wahrscheinlich am besten, einen Thread-Pool zu verwenden. Werfen Sie einen Blick auf
Future
,Callable
,Executor
Klassen imjava.util.concurrent
Paket.quelle
run()
Methode akzeptiert keine Parameter, daher können Sie dort keine Variable übergeben. Ich würde vorschlagen, dass Sie es im Konstruktor übergeben - ich werde meine Antwort bearbeiten, um das zu zeigen.new Thread() { public void run() {myMethod();}}.start();
Weg, ist das der kürzeste?Runnable
- meine ist eine Klasse, die erweitert wirdRunnable
. Und weil ich das getan habe, habe ich meinen eigenen Konstruktor, der den Zustand an das instanziierte Objekt übergibt.oder
oder
oder
oder
quelle
run()
?In Java 8 können Sie dies mit einer Codezeile tun.
Wenn Ihre Methode keine Parameter akzeptiert, können Sie eine Methodenreferenz verwenden:
Andernfalls können Sie die Methode in einem Lambda-Ausdruck aufrufen:
quelle
->
?Celery task queue
asynchrone Dinge verwenden würdenEine andere schnellere Option zum Aufrufen von Dingen (wie DialogBoxen und MessageBoxen und Erstellen separater Threads für nicht threadsichere Methoden) wäre die Verwendung des Lamba-Ausdrucks
quelle
Vor einiger Zeit hatte ich eine einfache Dienstprogrammklasse geschrieben, die den JDK5-Executor-Service verwendet und bestimmte Prozesse im Hintergrund ausführt. Da doWork () normalerweise einen ungültigen Rückgabewert hat, möchten Sie diese Dienstprogrammklasse möglicherweise verwenden, um sie im Hintergrund auszuführen.
Siehe diesen Artikel, in dem ich dieses Dienstprogramm dokumentiert hatte.
quelle
Um dies mit RxJava 2.x zu erreichen, können Sie Folgendes verwenden:
Die
subscribeOn()
Methode gibt an, auf welchem Scheduler die Aktion ausgeführt werden soll. RxJava verfügt über mehrere vordefinierte Scheduler, darunterSchedulers.io()
einen Thread-Pool für E / A-Vorgänge undSchedulers.computation()
einen für CPU-intensive Vorgänge.quelle
Wenn Sie mindestens Java 8 verwenden, können Sie eine Methode
runAsync
aus der Klasse CompletableFuture verwendenWenn Sie ein Ergebnis zurückgeben müssen, verwenden Sie
supplyAsync
stattdessenquelle