Está en la página 1de 2

TAP Competencia 3

Práctica 1 hilos

Propósito: realizar el cálculo del factorial mediante hilos:

Como sabes el factorial de n es n! = n*(n-1)*(n-2)*….*2*1 , donde n>0 , ya que 0! ->1.

Esta forma de cálculo es práctica cuando n es pequeña por ejemplo menor a 20, pero cuando se trata de
valores más grandes es conveniente usar la clase BigInteger

1. Aplica el uso de hilos con un proceso:


public class FactorialS implements Runnable
{
private BigInteger vf = BigInteger.ONE;
private int vn;
public FactorialS(int n)
{
vn=n;
}
public BigInteger vf()
{ //regresa el valor de factorial();
return vf;
}
private void factorial()
{
for(int i=1; i<=vn;i++)
{
vf = vf.multiply(BigInteger.valueOf(i));
try{
Thread.sleep(10);
}
catch(Exception e){}
}
}
@Override
public void run() {
factorial();
}
}

2 Pruébalo :
public class FactorialPrueba {
public static void main(String ar[]) throws InterruptedException
{ int n=20;
FactorialS of= new FactorialS(n);
long inicio= System.currentTimeMillis();
BigInteger vf;
Thread hf= new Thread(of);
hf.start();
long fin= System.currentTimeMillis();
vf = of.vf();
System.out.println("Calculo de factorial secuencial de "+n+" es "+ vf.toString()+" y su tiempo es "+ (fin-
inicio));
}

3. Realiza varias pruebas y observa que pasa

¿A qué crees que se deba esto?

4. Ahora aplica lo aprendido en el primer ejercicio de factorial para ocupar de manera efectiva el uso de
hilos:

Si n=20

Hilo_1= 20*19*18*17*16*…11

Hilo_2=10*9*8*…*3*2*1

Así que20 ! es: resultado del hilo_1 * resultado del hilo_2

Prueba creando un proceso al cual se le pase como argumentos el valor inicial vi y el valor el final vf y el
código de prueba

También podría gustarte