/ / Thread.start () no llama al método Thread.run () - java

Thread.start () no llama al método Thread.run () - java

En mis proyectos hay 3 clases que se extienden.Hilo, cada uno de ellos hace algún cálculo para el número entero. Necesito ejecutarlos para obtener los tres valores calculados. Este proceso debe realizarse para todos los enteros en un cierto rango.

Este es uno de mis hilos:

public class FactorialNumber extends Thread {
private int number;

public void setNumber(int number) {
this.number = number;
}

public void run() {
try {
sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.print(NumbersOperations.getFactorial(number));
}
}

Ese es un método que intenta iniciar hilos:

public static void getThreevalues() throws InterruptedException {
int startOfRange = getBorder("Enter the left border of range: ");
int endOfRange = getBorder("Enter the right border of range: ");
for(int i = startOfRange; i <= endOfRange; i++) {
PrimeNumber primeNumber = new PrimeNumber();
FibonachiNumber fibonachiNumber = new FibonachiNumber();
FactorialNumber factorialNumber = new FactorialNumber();
primeNumber.setNumber(i);
fibonachiNumber.setNumber(i);
factorialNumber.setNumber(i);
System.out.print("Number: " + i);
System.out.print(" is prime number ");
primeNumber.start();
System.out.print(". Fibonachi - " );
fibonachiNumber.start();
System.out.print(". Factorial - ");
factorialNumber.start();
System.out.println();

}
}

Después de ejecutar mi código me sale esto:

Number: 3 is prime number . Fibonachi - . Factorial -
Number: 4 is prime number . Fibonachi - . Factorial -
Number: 5 is prime number . Fibonachi - . Factorial -
Number: 6 is prime number . Fibonachi - . Factorial -
true2hi6falsetrue5hi2483falsehi720hi120

Como entiendo, start () no llama al método run (). En mi método de ejecución hay "sleep" (500), pero el resultado simplemente aparece en la consola sin ningún tipo de suspensión.

Apreciaría cualquier ayuda, ya que ya he dedicado demasiado tiempo a esto y lamentablemente no he resuelto el problema.

Respuestas

5 para la respuesta № 1

Aquí hay un par de cosas que te confundirán. Comencemos con algo que no es obvio:

System.out.print() utiliza el bloqueo para asegurarse de que los hilos no se impriman uno sobre el otro. Por lo tanto, cuando tiene dos hilos y uno imprime foo y las otras impresiones bar, puedes conseguir cualquiera foobar o barfoo pero nunca fboaro (= sin mezclar).

Eso también significa que cuando un hilo (el principal o uno de sus tres hilos de cálculo) imprime algo, todos los demás hilos que también quieran imprimir al mismo tiempo, esperarán.

Siguiente: Los hilos de inicio no los ponen en cola. Si inicia N hilos, el sistema ejecutará todos los códigos de ellos al mismo tiempo. Si todos duermen 500ms, entonces este dormir tendrá lugar en paralelo. Si desea que los subprocesos se ejecuten en un cierto orden, debe usar colas y bloqueos.

Por último: Comienzas los hilos pero nunca esperas los resultados. Entonces, lo que sucede es que el hilo principal inicia los hilos y luego continúa (probablemente termina). Luego, los tres hilos esperan 500 ms al mismo tiempo y luego intentan calcular el resultado e imprimirlo al mismo tiempo.

Como probablemente comiences a comprender, todo esto es bastante complejo y molesto. Es por eso que Java 6 introdujo el marco concurrente que resuelve muchos de estos problemas.

En pocas palabras, ya no cree hilos. Cree Callables que devuelve el resultado que desea y luego los envía a un ExecutorService. El servicio los ejecutará y volverá. Futures. A continuación, puede consultar el futuro para un resultado.

De esta manera, no tiene que lidiar con problemas de subprocesos de bajo nivel, sincronización, bloqueos y colas.

Relacionado:

(Editar para permitir eliminar downvote).


0 para la respuesta № 2

Sus resultados están ocultos probablemente en la última Cadena: "true2hi6falsetrue5hi2483falsehi720hi120". Todos los hilos ejecutan en realidad el comando:

System.out.print(NumbersOperations.getFactorial(number));

Cuando el bucle ha terminado porque tienen que esperar 0,5 segundos. Tienes tambien un print método para hacer esto, no una printlnPor lo tanto, cada resultado se "pega" a otro. Como indican los comentarios, los subprocesos no se ejecutan individualmente, no esperan, es decir, al final del anterior. Thread.


0 para la respuesta № 3

Y una cosa más que debes hacer: esperar a que terminen los hilos. Yo esperaría tres llamadas de Thread.join() de lo contrario, su programa podría finalizar y abortar los subprocesos (usted los marcó como demonio, ¿verdad?) antes de que puedan imprimir el resultado.


0 para la respuesta № 4

¡Gracias a todos! Me ayudó a entender mejor los hilos. Para resolver el problema, utilicé el método join (), así que ahora el método que inicia los hilos se ve así:

public static void getThreevalues() throws InterruptedException {
int startOfRange = getBorder("Enter the left border of range: ");
int endOfRange = getBorder("Enter the right border of range: ");
for(int i = startOfRange; i <= endOfRange; i++) {
PrimeNumber primeNumber = new PrimeNumber();
FibonachiNumber fibonachiNumber = new FibonachiNumber();
FactorialNumber factorialNumber = new FactorialNumber();
primeNumber.setNumber(i);
fibonachiNumber.setNumber(i);
factorialNumber.setNumber(i);
System.out.print("Number: " + i);
primeNumber.start();
primeNumber.join();
fibonachiNumber.start();
fibonachiNumber.join();
factorialNumber.start();
factorialNumber.join();
Thread.sleep(2000); // this line"s useful to present result by lines
System.out.println();
}
}

y mis clases de hilo no cambié.