Esto es tarea.Eliminar bloqueo de un método
No quiero la solución, solo un pequeño número de enlaces o ideas.
En pocas palabras lo que yo quiero hacer es,
ejemplo simple:
public class Example
{
public void method()
{
int x = doThat();
//Call other methods which do not depend on x
return;
}
}
doThat()
es un método que se sabe que es mucho tiempo, lo que se traduce en mi programa de bloqueo hasta que los resultados están de vuelta. Y quiero utilizar diferentes métodos de este objeto, pero el programa es frozen
hasta que finalice el doThat()
. Esos métodos diferentes no necesariamente tienen que invocarse desde el method()
utilizado en este ejemplo, pero quizás desde fuera del objeto.
Pensé en usar hilos, pero si tengo una gran cantidad de objetos (más de 1000) esto probablemente no sea muy eficiente (corríjanme si me equivoco, por favor). Supongo que si uso hilos, ¿debo usar un hilo por objeto?
¿Hay alguna otra manera además de los hilos que pueden hacer que el objeto invocado no se bloquee al llamar al doThat();
? Si el enhebrado es la única forma, ¿podría proporcionar un enlace?
Sabiendo que las preguntas como esa quedan invalidadas, aceptaré cualquier downvotes. Pero, por favor, solo un enlace sería más que excelente.
Gracias de antemano. Espero que la pregunta esté en línea con las reglas.
(mi) Común dice que no es posible hacer que un método sea susceptible de ser enhebrado, así que si hago que la clase 'Example' se pueda enhebrar, podré invocar otros métodos de esa clase cuando' method() 'esté bloqueado durante 'doThat()'? – Muggen
la clase de ejemplo no es la que se convertirá en un subproceso. Ejemplo debería ser el encargado de crear su grupo de subprocesos con n posibles subprocesos (Executors.newFixedThreadPool (n)) y luego tendrá que crear su propia clase extendiendo "Callable" para hacer el trabajo (son sus hilos). Su implementación de Callable.call() hará el trabajo (doThat()) y devolverá el resultado del cálculo. Pasa Callables al grupo de subprocesos a través de ExecutorService.submit (invocable) y recupera el resultado a través de Future.get(). Tome nota de que esta última llamada está bloqueando, debe hacerlo justo antes de su regreso. – Kellindil