1. Imprime ¡Hola, mundo! desde un hilo.
2. Imprime cinco veces ¡Hola, mundo! mediante cinco hilos diferentes.
3. Imprime cinco veces mediante cinco hilos diferentes ¡Hola, soy el hilo X! donde X es el número o identificador del hilo.
4. Con dos hilos, incrementa un entero compartido en uno repetidamente, sin sincronización, 1 000 000 de veces (500 000 cada uno) e imprime el resultado al final del programa.
5. Con dos hilos, incrementa un entero compartido en uno repetidamente, con sincronización, 1 000 000 de veces (500 000 cada uno) e imprime el resultado al final del programa.
6. Lanza dos hilos simultáneamente: un hilo que incremente un entero en uno 1 000 000 de veces y un segundo hilo que imprima el valor de dicho entero en ese momento.
7. Lanza dos hilos simultáneamente: un hilo que incremente un entero en uno 1 000 000 de veces y un segundo hilo que espere (método wait()) la notificación (método notify()) del primero que ha finalizado para imprimir finalmente dicho entero.
8. Simula una carrera de relevos con cuatro corredores. Cada corredor es un hilo que empezará a correr cuando el otro termine (excepto el primero). Usa los métodos start() y join() alternativamente para cada hilo.
9. Repite la actividad anterior pero esta vez usando los métodos wait() y notify().
10. Simula una carrera de 100 metros de cinco animales, donde cada animal es un hilo que avanza 1 metro en cada iteración de un bucle. Muestra los progresos de cada animal y el ranking final. Puedes usar el método yield() al final de cada iteración para hacer la carrera más igualada.
11. Dado un entero n divisible por 5, calcula la suma de todos los enteros desde 1 hasta n, ambos incluidos. Divide el trabajo en, al menos, 5 hilos.
12. Dado un String, calcula el número de vocales que existen. Para ello, lanza cinco hilos: uno para cada vocal. Muestra el total para cada vocal y el total de vocales.
13. Repite la actividad anterior pero dado un fichero de texto.
14. Dadas dos matrices de enteros 3 × 3, calcula su multiplicación. Para ello, lanza nueve hilos: uno para calcular cada elemento.
15. Simula un conversor de escala de grises a binario. Para ello, dada una matriz 100 × 100 de enteros aleatorios entre 0 y 255 (ambos incluidos), conviértela en una nueva matriz 100 × 100 donde los valores de 0 a 127 pasen a 0 y los valores de 128 a 255 a 1. Divide el trabajo en 4 hilos, uno por cada region de 50 × 50.
16. Repite la actividad anterior pero dada una imagen. Pistas: 1, 2.
17. Simula una carrera de relevos con cuatro corredores y con paso de testigo. Cada corredor es un hilo que empezará a correr cuando el otro termine (excepto el primero). Utiliza synchronized(), wait() y notify() para el paso del testigo.
18. Repite la actividad anterior pero utilizando la clase Semaphore.
19 (lector-escritor). Simula el acceso y escritura a una base de datos. Para ello, lanza 20 hilos simultáneamente, 10 de lectura y 10 de escritura de un entero. Los hilos de escritura incrementarán en uno el entero mientras no haya otro hilo de escritura escribiendo o un hilo de lectura leyendo. Los de lectura pueden leer e imprimir el entero aunque haya otros hilos de lectura pero no mientras haya uno de escritura escribiendo. Usa la clase Semaphore de Java.
20 (productor-consumidor). Simula la Lotería de Navidad. Para ello, lanza dos hilos simultáneamente, uno que produce los números y otro que los consume y los muestra.
21. Dadas dos matrices de enteros aleatorios 100 × 100, calcula su multiplicación sin usar hilos. A continuación, hazlo de nuevo pero con 10 000 hilos: uno para calcular cada elemento. Por último, cálcula el tiempo de ejecución con y sin hilos.
Curso creado por Manuel Ignacio López Quintero bajo esta licencia.