Apuntes DAM

Chuleta de Programación de Servicios y Procesos

Procesos, hilos, sincronización, concurrencia moderna, sockets TCP y UDP, HTTP y criptografía en Java.

Ponte a prueba con un simulacro

Procesos

ProcessBuilder pb = new ProcessBuilder("java", "-cp", "bin", "Hijo", "5");pb.redirectErrorStream(true);Process p = pb.start();try (BufferedReader r = p.inputReader()) {  r.lines().forEach(System.out::println);    // salida del hijo}int codigo = p.waitFor();                     // 0 = terminó bien

Proceso: memoria propia. Hilo: comparte la memoria del proceso. Estados: nuevo, listo, ejecución, bloqueado, terminado.

Tema: Programación Concurrente

Crear hilos

Thread t = new Thread(() -> trabajo(), "worker-1");t.start();            // nunca run(): no crearía un hilo nuevot.join();             // esperar a que termineThread v = Thread.ofVirtual().start(() -> tarea());   // Java 21t.interrupt();        // pedir que pare; comprobar isInterrupted()
Tema: Hilos y Multithreading en Java

Sincronización

synchronized (this) { … }Un solo hilo a la vez en la sección crítica
wait() · notifyAll()Esperar una condición dentro de while · avisar
volatileVisibilidad entre hilos (no atomicidad)
AtomicInteger.incrementAndGet()Contador sin bloqueo
ReentrantLock · lock()/unlock() en finallyBloqueo explícito con tryLock
Semaphore(3)Como máximo 3 hilos dentro
CountDownLatch(n)Esperar a que n tareas terminen
BlockingQueue put/takeProductor-consumidor sin wait/notify
ConcurrentHashMap.mergeMapa seguro entre hilos
Tema: Hilos y Multithreading en Java

Ejecutores y futuros

try (ExecutorService ex = Executors.newFixedThreadPool(4)) {  Future<Integer> f = ex.submit(() -> calcular());  Integer r = f.get(2, TimeUnit.SECONDS);}CompletableFuture  .supplyAsync(() -> descargar(url))  .thenApply(this::procesar)  .exceptionally(e -> valorPorDefecto)  .thenAccept(System.out::println);
Tema: Hilos y Multithreading en Java

Problemas clásicos

Condición de carreraResultado depende del orden de los hilos (count++ no es atómico)
Interbloqueo (deadlock)Cada hilo espera un recurso del otro; evitar pidiendo los cerrojos en el mismo orden
InaniciónUn hilo nunca obtiene el recurso
Productor-consumidorBúfer compartido con capacidad limitada
Lectores-escritoresVarios leen a la vez, uno escribe solo (ReadWriteLock)
FilósofosEjemplo de interbloqueo e inanición
Tema: Programación Concurrente

Servidor TCP

try (ServerSocket ss = new ServerSocket(5000);     ExecutorService pool = Executors.newVirtualThreadPerTaskExecutor()) {  while (true) {    Socket s = ss.accept();                    // bloquea hasta un cliente    pool.submit(() -> atender(s));             // un hilo por cliente  }}void atender(Socket s) {  try (s; var in = new BufferedReader(new InputStreamReader(s.getInputStream()));       var out = new PrintWriter(s.getOutputStream(), true)) {    String l;    while ((l = in.readLine()) != null) out.println(l.toUpperCase());  } catch (IOException e) { … }}

Cliente: new Socket("localhost", 5000). setSoTimeout(ms) evita bloquear para siempre.

Tema: Sockets en Java

UDP

try (DatagramSocket ds = new DatagramSocket()) {  byte[] datos = "hola".getBytes(StandardCharsets.UTF_8);  ds.send(new DatagramPacket(datos, datos.length, InetAddress.getByName("localhost"), 6000));  byte[] buf = new byte[1024];  DatagramPacket r = new DatagramPacket(buf, buf.length);  ds.receive(r);  String texto = new String(r.getData(), 0, r.getLength(), StandardCharsets.UTF_8);}

UDP: sin conexión, sin garantía de orden ni entrega. TCP: conexión, orden y reenvío.

Tema: Sockets en Java

HTTP desde Java

HttpClient c = HttpClient.newHttpClient();HttpRequest req = HttpRequest.newBuilder(URI.create("https://api.ej.com/items"))  .header("Content-Type", "application/json")  .POST(HttpRequest.BodyPublishers.ofString(json))  .build();HttpResponse<String> res = c.send(req, HttpResponse.BodyHandlers.ofString());System.out.println(res.statusCode() + " " + res.body());
Tema: Desarrollo de Servicios en Red

Códigos HTTP

200 OK · 201 Created · 204 No ContentÉxito
301 · 302 · 304Redirección · no modificado
400 · 401 · 403 · 404 · 409Petición mal formada · sin autenticar · prohibido · no existe · conflicto
500 · 503Error del servidor · no disponible
Tema: Desarrollo de Servicios en Red

Criptografía

MessageDigest.getInstance("SHA-256")Resumen (hash): comprobar integridad
PBKDF2 / bcrypt con salGuardar contraseñas, nunca SHA solo
Cipher "AES/GCM/NoPadding"Cifrado simétrico con IV aleatorio de 12 bytes
KeyPairGenerator "RSA"Asimétrico: cifrar con la pública, descifrar con la privada
Signature "SHA256withRSA"Firmar con la privada, verificar con la pública
SecureRandomNúmeros aleatorios para claves y tokens
SSLServerSocketFactory · keytoolTLS con un almacén de claves
Tema: Programación Segura en Java

Chuletas de otras asignaturas