Pular para conteúdo

Threads e Tarefas

Uma tarefa é uma unidade de trabalho. Uma thread é um mecanismo de execução com uma pilha de chamadas. Separá-las permite que um executor decida onde e quando as tarefas serão executadas.

Threads de plataforma e virtuais

Threads de plataforma são normalmente mapeadas para threads do sistema operacional. Threads virtuais são threads Java escalonadas pelo runtime e projetadas para aceitar grandes quantidades de tarefas principalmente bloqueantes no estilo de uma thread por tarefa.

Threads virtuais não tornam o trabalho de CPU mais rápido nem eliminam a necessidade de limitar recursos escassos como conexões de banco de dados. O guia pools e recursos limitados explica por que a escalabilidade de threads não cria capacidade nos serviços dependentes. Operações bloqueantes longas podem liberar uma thread portadora, mas o serviço externo continua sendo um limite de capacidade.

try (ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor()) {
    Future<String> first = executor.submit(() -> fetch("https://example.com/a"));
    Future<String> second = executor.submit(() -> fetch("https://example.com/b"));
    consume(first.get(), second.get());
}

Cancelamento e interrupção

Interrupção é um pedido cooperativo. Métodos Java bloqueantes podem lançar InterruptedException; a computação deve verificar periodicamente a interrupção quando apropriado. Se uma camada não pode propagar a exceção verificada, normalmente restaura o estado antes de retornar ou a traduz:

catch (InterruptedException exception) {
    Thread.currentThread().interrupt();
    throw new IllegalStateException("operation interrupted", exception);
}

Uma política de cancelamento deve definir responsabilidade, limpeza, deadlines e o resultado observado pelos chamadores. Um deadline total deve incluir filas e atrasos de novas tentativas. Em geral, interromper forçadamente um código arbitrário não preserva seus invariantes.