0 votos
Hola!
Recientemente estoy aprendiendo a hacer varios hilos para mi programa para que vaya ejecutando en segundo plano los cálculos pesados y las acciones que el usuario no necesita ver en el momento para dejarle libre y que pueda seguir haciendo cosas y no tenga que esperar.

Haciendo esto se me plantea una pregunta que no he conseguido encontrar una respuesta convincente en la red y me he decidido a colgarla aquí.

Mi intención es que en una misma clase, como una clases con la que gentiono todo lo que tiene que ver con una base de datos, todas estas acciones estén en segundo plano. De momento solo consigo que uno de los métodos, el que este dentro de 'run()' sea en segundo plano, y el resto el usuario tiene que esperar a que acaben. ¿Es posible tener varios métodos dentro de una misma clase que se puedan ejecutar en segundo plano al igual que el código que esté dentro de 'run()' o tengo que solucionarlo de otra forma (Descargando a otras clases o de algún otro modo)?

Muchas gracias de antemano, un saludo

Angel F.
preguntado por Angel F Ago 14, 2016 en Lenguajes de programación

1 Respuesta

0 votos

Poder podrías llamar en cada hilo a un método de un objeto instanciado, aunque es un poco peligroso. Te recomiendo que hagas varias clases con las funcionalidades diferentes. Por ejemplo, para hacer algo como lo que necestias yo haría un ExecutorService como el siguiente con dos hilos Future (cada uno de estos tienen las clases que van a ejecutar algo). De este modo cuando terminen los dos hilos haré algo con el resultado (que en este ejemplo el resultado es un Double, pero podría ser cualquier cosa):

ExecutorService executor = Executors.newWorkStealingPool();

Future<Double> futureUno = executor.submit(new HiloUno());
Future<Double> futureDos = executor.submit(new HiloDos());

executor.shutdown();
executor.awaitTermination(5, TimeUnit.SECONDS);

Double resultadoUno = futureOne.get();
Double resultadoDos = futureTwo.get();

Las clases de antes HiloUno e HiloDos van a tener las funcionalidades diferentes. En el método sobrescrito call() es donde va a estar el trabajo. El contenido de estas clases podría ser algo así:

import java.util.List;
import java.util.concurrent.Callable;

public class HiloUno implements Callable<Double>{

    @Override
    public Double call() throws Exception {
        //Algo que hacer
        return 123.0; //Devuelvo un Double en este caso
    }

}

Espero que haya solucionado algo :D

respondido por Ramon [Admin] Ago 15, 2016