1. Coordinador de procesos
Difícil · Programación Concurrente · apuntesdam.com/subject/prog-servicios/topic/concurrencia
El programa puede funcionar en dos modos. Si recibe los argumentos «trabajador desde hasta», es un proceso hijo: cuenta los primos de ese tramo y escribe el número (ya está hecho). Si no, es el coordinador: lee un límite y un número de procesos, reparte el intervalo [1, límite] en tantos tramos iguales como procesos (el último se queda con el resto) y lanza un proceso hijo por tramo con ProcessBuilder, ejecutando esta misma clase. Primero lanza todos y después lee la salida de cada uno en orden y espera a que termine. Muestra «Proceso i [desde, hasta]: n primos» y, al final, «Total: N primos hasta límite».
import java.io.*;import java.util.*; public class Main { static boolean esPrimo(long n) { if (n < 2) return false; for (long d = 2; d * d <= n; d++) if (n % d == 0) return false; return true; } static long contar(long desde, long hasta) { long c = 0; for (long i = desde; i <= hasta; i++) if (esPrimo(i)) c++; return c; } public static void main(String[] args) throws Exception { // Modo trabajador: el proceso hijo cuenta su tramo y escribe el resultado if (args.length == 3 && args[0].equals("trabajador")) { System.out.println(contar(Long.parseLong(args[1]), Long.parseLong(args[2]))); return; } Scanner sc = new Scanner(System.in); long limite = sc.nextLong(); int procesos = sc.nextInt(); // TODO: repartir [1, limite] en tramos, lanzar un proceso hijo por tramo, // leer su resultado y mostrar el resumen }}Ejemplo: 10 000 con 4 procesos
Entrada
10000 4Salida esperada
Proceso 1 [1, 2500]: 367 primos
Proceso 2 [2501, 5000]: 302 primos
Proceso 3 [5001, 7500]: 281 primos
Proceso 4 [7501, 10000]: 279 primos
Total: 1229 primos hasta 10000Ejemplo: Reparto con resto
Entrada
100 3Salida esperada
Proceso 1 [1, 33]: 11 primos
Proceso 2 [34, 66]: 7 primos
Proceso 3 [67, 100]: 7 primos
Total: 25 primos hasta 100