Programa que divide el conteo de números entre múltiples hilos (threads) y mide el tiempo total de ejecución. Implementado en dos lenguajes para comparar su modelo de concurrencia: Java con Thread y Go con goroutines.
Ambas versiones piden al usuario un número total y una cantidad de hilos, reparten el rango equitativamente entre ellos (manejando el residuo), los ejecutan en paralelo y reportan el tiempo transcurrido en nanosegundos.
Implementación con goroutines y sync.WaitGroup.
helloThread(initialNumber, finalNumber int, wg *sync.WaitGroup)— goroutine que imprime los números en su rango asignado. Llama awg.Done()al terminar viadefer.count(numberThreads, number int)— calcula el rango de cada goroutine distribuyendo el residuo entre las primeras, lanza todas congo, espera conwg.Wait()y mide el tiempo contime.Since.main()— lee los inputs del usuario y valida que sean positivos antes de llamar acount.
go run main.goImplementación con la clase Thread de Java extendida directamente.
Extiende Thread. Recibe el rango [initialNumber, finalNumber) en el constructor y lo imprime en run().
Contiene la lógica principal:
count(int numberThreads, int number)— distribuye el rango entre instancias deHelloThread, las inicia constart(), espera a todas conjoin()y mide el tiempo conSystem.nanoTime().main(String[] args)— lee los inputs conScannery llama acount, manejandoInterruptedException.
javac javaX/*.java
java javaX.PruebaIngresa el número total: 10 Ingresa la cantidad de threads: 3
0-
1-
2-
3-
4-
5-
6-
7-
8-
9-
Tiempo total: 63224700 ns
Prueba realizada con n = 50000000
| Cantidad de hilos | Tiempo total |
|---|---|
| 2 hilos | 149 ms |
| 8 hilos | 102 ms |
| 16 hilos | 82 ms |
| Cantidad de goroutines | Tiempo total |
|---|---|
| 2 goroutines | 69 ms |
| 8 goroutines | 36 ms |
| 16 goroutines | 47 ms |
| Hilos/Goroutines | Java | Go |
|---|---|---|
| 2 | 149 ms | 69 ms |
| 8 | 102 ms | 36 ms |
| 16 | 82 ms | 47 ms |