¿Cómo llamar a un método con un hilo separado en Java?

digamos que tengo un método doWork() . Cómo lo llamo desde un hilo separado (no el hilo principal).

Crea una clase que implemente la interfaz Runnable . Coloque el código que desea ejecutar en el método run() : ese es el método que debe escribir para cumplir con la interfaz de Runnable . En su hilo “principal”, cree una nueva clase Thread , pasando al constructor una instancia de Runnable , luego llame a start() en él. start le dice a la JVM que haga la magia para crear una nueva secuencia, y luego llama a su método de run en esa nueva secuencia.

 public class MyRunnable implements Runnable { private int var; public MyRunnable(int var) { this.var = var; } public void run() { // code in the other thread, can reference "var" variable } } public class MainThreadClass { public static void main(String args[]) { MyRunnable myRunnable = new MyRunnable(10); Thread t = new Thread(myRunnable) t.start(); } } 

Eche un vistazo al tutorial de simultaneidad de Java para comenzar.

Si su método va a ser llamado con frecuencia, entonces no vale la pena crear un nuevo hilo cada vez, ya que esta es una operación costosa. Probablemente sea mejor usar un grupo de subprocesos de algún tipo. Eche un vistazo a las clases Future , Callable , Executor en el paquete java.util.concurrent .

Qué tal si :

  Thread t1 = new Thread(new Runnable() { public void run() { // code goes here. } }); t1.start(); OR new Thread(new Runnable() { public void run() { // code goes here. } }).start(); 

Otra opción:

 Executors.newSingleThreadExecutor().execute(new Runnable() { @Override public void run() { myCustomMethod(); } }); 

o

 Executors.newCachedThreadPool().execute(new Runnable() { @Override public void run() { myCustomMethod(); } }); 

En Java 8 puedes 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:

 new Thread(MyClass::doWork).start(); 

De lo contrario, puede llamar al método en una expresión lambda:

 new Thread(() -> doWork(someParam)).start(); 

Hace algún tiempo, escribí una clase de utilidad simple que usa el servicio de ejecutor 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 ejecutarlo en segundo plano.

Vea este artículo donde documenté esta utilidad.

Otra opción más rápida para llamar cosas (como DialogBoxes y MessageBoxes y crear subprocesos separados para métodos seguros que no sean hilos) sería usar la Expresión de Lamba

  new Thread(() -> { "code here" }).start(); 

Para lograr esto con RxJava 2.x puede usar:

 Completable.fromAction(this::dowork).subscribeOn(Schedulers.io().subscribe(); 

El método subscribeOn() especifica en qué planificador ejecutar la acción: RxJava tiene varios planificadores predefinidos, incluidos Schedulers.io() que tiene un grupo de subprocesos destinado a operaciones de E / S, y Schedulers.computation() que está destinado para CPU intensiva operaciones.