Digamos que tengo un método doWork()
. ¿Cómo lo llamo desde un hilo separado (no el hilo principal)?
java
multithreading
Louis Rhys
fuente
fuente
Respuestas:
Cree una clase que implemente la
Runnable
interfaz. Coloque el código que desea ejecutar en elrun()
método; ese es el método que debe escribir para cumplir con laRunnable
interfaz. En su hilo "principal", cree una nuevaThread
clase, pasando al constructor una instancia de suRunnable
, luego invoquestart()
.start
le dice a la JVM que haga la magia para crear un nuevo hilo, y luego llame a surun
método en ese nuevo hilo.Eche un vistazo al tutorial de concurrencia de Java para comenzar.
Si su método se va a llamar con frecuencia, entonces puede que no valga la pena crear un nuevo hilo cada vez, ya que esta es una operación costosa. Probablemente sería mejor usar un grupo de subprocesos de algún tipo. Echar un vistazo a
Future
,Callable
,Executor
clases en eljava.util.concurrent
paquete.fuente
run()
método no toma parámetros, por lo que no puede pasar una variable allí. Te sugiero que lo pases en el constructor. Editaré mi respuesta para mostrar eso.new Thread() { public void run() {myMethod();}}.start();
camino, ¿es el más corto?Runnable
: la mía es una clase que se extiendeRunnable
. Y como he hecho eso, tengo mi propio constructor que pasa el estado al objeto instanciado.o
o
o
o
fuente
run()
?En Java 8 puede hacer esto con una línea de código.
Si su método no toma ningún parámetro, puede usar una referencia de método:
De lo contrario, puede llamar al método en una expresión lambda:
fuente
->
?Celery task queue
Otra opción más rápida para llamar a cosas (como DialogBoxes y MessageBoxes y crear subprocesos separados para métodos que no sean seguros para subprocesos) sería usar Lamba Expression
fuente
Hace algún tiempo, había escrito una clase de utilidad simple que usa el servicio de ejecución JDK5 y ejecuta procesos específicos en segundo plano. Como doWork () normalmente tendría un valor de retorno nulo, es posible que desee utilizar esta clase de utilidad para ejecutarla en segundo plano.
Vea este artículo donde había documentado esta utilidad.
fuente
Para lograr esto con RxJava 2.x puede usar:
El
subscribeOn()
método especifica en qué planificador ejecutar la acción: RxJava tiene varios planificadores predefinidos, incluido elSchedulers.io()
que tiene un grupo de subprocesos destinado a operaciones de E / S y elSchedulers.computation()
que está destinado a operaciones intensivas de CPU.fuente
Si está utilizando al menos Java 8, puede usar el método
runAsync
de la clase CompletableFutureSi necesita devolver un resultado, use
supplyAsync
en su lugarfuente