Chuleta de Programación de Servicios y Procesos
Procesos, hilos, sincronización, concurrencia moderna, sockets TCP y UDP, HTTP y criptografía en Java.
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ó bienProceso: memoria propia. Hilo: comparte la memoria del proceso. Estados: nuevo, listo, ejecución, bloqueado, terminado.
Tema: Programación ConcurrenteCrear 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 |
| volatile | Visibilidad entre hilos (no atomicidad) |
| AtomicInteger.incrementAndGet() | Contador sin bloqueo |
| ReentrantLock · lock()/unlock() en finally | Bloqueo explícito con tryLock |
| Semaphore(3) | Como máximo 3 hilos dentro |
| CountDownLatch(n) | Esperar a que n tareas terminen |
| BlockingQueue put/take | Productor-consumidor sin wait/notify |
| ConcurrentHashMap.merge | Mapa seguro entre hilos |
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 carrera | Resultado 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ón | Un hilo nunca obtiene el recurso |
| Productor-consumidor | Búfer compartido con capacidad limitada |
| Lectores-escritores | Varios leen a la vez, uno escribe solo (ReadWriteLock) |
| Filósofos | Ejemplo de interbloqueo e inanición |
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 JavaUDP
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 JavaHTTP 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 · 304 | Redirección · no modificado |
| 400 · 401 · 403 · 404 · 409 | Petición mal formada · sin autenticar · prohibido · no existe · conflicto |
| 500 · 503 | Error del servidor · no disponible |
Criptografía
| MessageDigest.getInstance("SHA-256") | Resumen (hash): comprobar integridad |
|---|---|
| PBKDF2 / bcrypt con sal | Guardar 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 |
| SecureRandom | Números aleatorios para claves y tokens |
| SSLServerSocketFactory · keytool | TLS con un almacén de claves |
apuntesdam.com/subject/prog-servicios/chuleta
Chuletas de otras asignaturas
Entornos de DesarrolloProgramaciónLenguajes de MarcasBases de DatosSistemas InformáticosAcceso a DatosDesarrollo de InterfacesProgramación Multimedia y Dispositivos MóvilesSistemas de Gestión EmpresarialDesarrollo Web en Entorno ClienteDesarrollo Web en Entorno ServidorDespliegue de Aplicaciones WebDiseño de Interfaces Web