Soy nuevo en multithreading. Así que aquí está el problema en el que estoy trabajando: almacene los últimos cuatro dígitos de su identificación de estudiante en dos clases separadas. Por ejemplo, si su ID es SE123456789, almacene 67 en la primera clase Thread1 y 89 en la clase Thread2 que luego se pasará a la clase Factorial. La clase Thread1 pasará 67 a la clase Factorial y printfactorial() imprimirá factorial de todos los números del 1 al 67. La clase Thread2 pasará 89 a la clase Factorial y printfactorial() imprimirá factorial de todos los números del 1 al 89. Debe usar thread.sleep (10) después de cada cálculo dentro del ciclo. Como sabe que no puede almacenar e imprimir factorial de números grandes en números enteros simples o variables de tipo largo, debe utilizar BigInteger para almacenar e imprimir números muy largos. El método printfactorial() debe sincronizarse para que los resultados de Thread1 se impriman primero y luego se calcule e imprima el resultado de Thread2. Y esto es lo que he hecho hasta ahora. Tengo cuatro clases diferentes

Main
Factorial
Thread1
Thread2

Thread1 y Thread2 extienden la clase Thread. Aquí está el código que escribí hasta ahora:

Principal

public class Main {
 public static void main(String args[]){
    Factorial factorial = new Factorial();  
    Thread1 t1 = new Thread1(factorial);
    Thread1 t2 = new Thread1(factorial);
    t1.start();
    t2.start();
 }
}

Clase factorial

import java.math.BigInteger;
public class Factorial {
    public void printFactorial(int number){
        BigInteger bigInteger = new BigInteger("1");
        try{
            for(int i=1; i<=number; i++){
                bigInteger = bigInteger.multiply(BigInteger.valueOf(i));
                Thread.sleep(10); 
                System.out.println(bigInteger);
            }
        }catch(InterruptedException ex){
            System.out.println("the interruption has occurred in the thread");
        }
    }
}

Hilo1

package com.mycompany.factorial;
public class Thread1 extends Thread {
    Factorial factorial;
    Thread1(Factorial fact){
        factorial = fact;
    }
    @Override
    public void start(){
        synchronized(factorial){
            try{
                /*my ID is: SE170400080
                so the second last two digits are 00.
                **/
                factorial.printFactorial(00); //here's the problem
            }catch(Exception e){
                System.out.println("the interruption has occurred in the thread");
            }
        }
    }
}

Hilo2

package com.mycompany.factorial;

public class Thread2 extends Thread {
    Factorial factorial;
    Thread2(Factorial fact){
        factorial = fact;
    }
    @Override
    public void start(){
        synchronized(factorial){
            try{
                factorial.printFactorial(80);
              
            }catch(Exception e){
                System.out.println("the interruption has occurred in the thread");
            }
        }
    }
}

Después de ejecutar main, se compila correctamente pero no muestra el resultado requerido.

enter image description here

La ayuda sería muy apreciada, hice todo lo posible para mantenerla en el punto.

1:

2
mrseven7 25 jul. 2020 a las 13:36

2 respuestas

La mejor respuesta

Hay algunos errores en su código:

  1. Anular el método run, en lugar de start: start solo inicia su hilo, pero el código real que se está ejecutando pertenece al método run. Un pequeño tutorial está en el sitio web de Oracle.

  2. En main, crea dos instancias de Thread1, un error probable al copiar y pegar

0
Andrew Vershinin 25 jul. 2020 a las 11:25

No es una respuesta completa, pero necesita saber esto:

Una instancia de Thread no es un hilo. Un hilo es un objeto en el sistema operativo que ejecuta su código. Una instancia Java Thread es un objeto en su programa que puede usar para crear y administrar un hilo del sistema operativo.

La instancia Thread crea el hilo del sistema operativo cuando llama a t.start(). No anule el método start() porque si lo hace, nunca creará el hilo. Simplemente llamará al método que usted escribió si anula start().

Cuando llama al método normal t.start() y crea un nuevo hilo, el nuevo hilo llamará al t.run(). El método run() es el que desea anular porque su código es el que se ejecutará en el nuevo hilo.

1
Solomon Slow 25 jul. 2020 a las 11:28