💻 Exemplos: Capítulo 03: Estruturas Repetitivas (while, do-while, for clássico e for-each) e Controle de Laços
Especialização em Sistemas com Java 21 LTS • Capítulo 03
🎯 Visão Geral dos Exemplos Práticos
Neste laboratório prático, implementaremos exemplos corporativos completos explorando:
- Padrão Retry com Exponential Backoff em
do-while: resiliência de conexão de rede com tentativas progressivas e jitter. - Varredura de Matrizes com Laços Rotulados (
labeled break/continue): saída imediata de aninhamentos complexos em processamento numérico. - Iteração Segura e Evitação de
ConcurrentModificationException: manipulação de coleções ativas comIterator.remove()vsremoveIf.
💻 Exemplo 01 — Algoritmo de Conexão com Retry Resiliente (do-while)
package com.empresa.repeticoes;
import java.util.Random;
/**
* Mecanismo de conexão com política de retentativa e backoff exponencial.
*/
public class ConexaoResilienteService {
private static final int MAX_TENTATIVAS = 4;
private static final long DELAY_BASE_MS = 100;
private static final Random RANDOM = new Random();
public static boolean conectarClusterDatabase(String urlConexao) {
int tentativa = 0;
boolean conectado = false;
long tempoEspera = DELAY_BASE_MS;
System.out.printf("🔌 Estabelecendo conexão com o cluster: [%s]%n", urlConexao);
do {
tentativa++;
System.out.printf(" [TENTATIVA %d/%d] Enviando pacote SYN... ", tentativa, MAX_TENTATIVAS);
// Simula falha transitória nas 2 primeiras tentativas
if (tentativa < 3) {
System.out.println("❌ TIMEOUT / FALHA TRANSITÓRIA");
try {
// Backoff exponencial: base * 2^(tentativa-1) + jitter aleatório
long jitter = RANDOM.nextInt(50);
long sleepTime = tempoEspera + jitter;
System.out.printf(" ⏳ Aguardando %d ms antes da próxima retentativa...%n", sleepTime);
Thread.sleep(sleepTime);
tempoEspera *= 2; // Dobra o tempo
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
return false;
}
} else {
System.out.println("✅ SUCESSO [ACK RECEBIDO]!");
conectado = true;
}
} while (!conectado && tentativa < MAX_TENTATIVAS);
return conectado;
}
public static void main(String[] args) {
boolean sucesso = conectarClusterDatabase("jdbc:postgresql://db-cluster.corp.internal:5432/financeiro");
System.out.printf("Status Final do Serviço de Banco: %s%n", sucesso ? "ONLINE (PRONTO)" : "OFFLINE (FALHA)");
}
}
💻 Exemplo 02 — Processamento de Malha Bidimensional com Labeled Break
package com.empresa.repeticoes;
/**
* Varredura matricial com detecção precoce de anomalia utilizando rótulos de controle.
*/
public class AnalisadorMalhaSensores {
public static void main(String[] args) {
// Matriz de temperaturas de sensores industriais (linhas = setores, colunas = máquinas)
double[][] temperaturasSetores = {
{ 45.2, 48.0, 47.5, 49.1 },
{ 52.3, 54.0, 125.8, 51.0 }, // Sensor [1][2] superaqueceu (> 100°C)
{ 41.0, 42.5, 43.1, 40.8 }
};
final double LIMIAR_CRITICO = 100.0;
int setorCritico = -1;
int maquinaCritica = -1;
double temperaturaAnomala = 0.0;
System.out.println("================================================================================");
System.out.println(" MONITORAMENTO INDUSTRIAL: VARREDURA DE MATRIZ COM LABELS ");
System.out.println("================================================================================");
varreduraIndustrial:
for (int setor = 0; setor < temperaturasSetores.length; setor++) {
System.out.printf("🔍 Inspecionando Setor Industrial #%d...%n", setor + 1);
for (int maq = 0; maq < temperaturasSetores[setor].length; maq++) {
double temp = temperaturasSetores[setor][maq];
if (temp >= LIMIAR_CRITICO) {
setorCritico = setor + 1;
maquinaCritica = maq + 1;
temperaturaAnomala = temp;
System.out.printf("🚨 [EMERGÊNCIA] Máquina #%d registrou %.1f°C! Interrupção de emergência!%n",
maquinaCritica, temp);
break varreduraIndustrial; // Interrompe imediatamente ambos os laços
}
System.out.printf(" Setor %d / Máquina %d: %.1f°C [OK]%n", setor + 1, maq + 1, temp);
}
}
System.out.println("--------------------------------------------------------------------------------");
if (setorCritico != -1) {
System.out.printf("PARECER: Protocolo de resfriamento ativado no Setor %d, Máquina %d (%.1f°C).%n",
setorCritico, maquinaCritica, temperaturaAnomala);
} else {
System.out.println("PARECER: Todas as máquinas operando em níveis nominais.");
}
System.out.println("================================================================================");
}
}
📋 Resultado Esperado no Console
🔌 Estabelecendo conexão com o cluster: [jdbc:postgresql://db-cluster.corp.internal:5432/financeiro]
[TENTATIVA 1/4] Enviando pacote SYN... ❌ TIMEOUT / FALHA TRANSITÓRIA
⏳ Aguardando 124 ms antes da próxima retentativa...
[TENTATIVA 2/4] Enviando pacote SYN... ❌ TIMEOUT / FALHA TRANSITÓRIA
⏳ Aguardando 238 ms antes da próxima retentativa...
[TENTATIVA 3/4] Enviando pacote SYN... ✅ SUCESSO [ACK RECEBIDO]!
Status Final do Serviço de Banco: ONLINE (PRONTO)
================================================================================
MONITORAMENTO INDUSTRIAL: VARREDURA DE MATRIZ COM LABELS
================================================================================
🔍 Inspecionando Setor Industrial #1...
Setor 1 / Máquina 1: 45.2°C [OK]
Setor 1 / Máquina 2: 48.0°C [OK]
Setor 1 / Máquina 3: 47.5°C [OK]
Setor 1 / Máquina 4: 49.1°C [OK]
🔍 Inspecionando Setor Industrial #2...
Setor 2 / Máquina 1: 52.3°C [OK]
Setor 2 / Máquina 2: 54.0°C [OK]
🚨 [EMERGÊNCIA] Máquina #3 registrou 125.8°C! Interrupção de emergência!
--------------------------------------------------------------------------------
PARECER: Protocolo de resfriamento ativado no Setor 2, Máquina 3 (125.8°C).
================================================================================