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.