Como funciona Java Thread Pool?

Pergunta de entrevista***

Vamos lá, diretamente ao ponto:

Internamente, as tasks são inseridas em uma Blocking Queue da qual as threads do pool estão sendo desenfileirados. Quando uma nova task é inserida na fila, uma das threads ociosas a desenfileirará com sucesso e a executará. O restante das Threads ociosas no pool serão bloqueadas, aguardando para desenfileirar tasks.

Thread Pool é usado principalmente para reduzir o número de threads do aplicativo e fornecer gerenciamento das threads de trabalho. Os aplicativos podem enfileirar itens de trabalho(work items), associar esses workers à handles, enfileirar automaticamente com base em um keepAliveTime e vincular com I/O.

Resposta curta:

Java Thread pool representa um grupo de threads de trabalho que estão aguardando a tarefa e são reutilizadas muitas vezes.

Agora um pouco mais devagar 🙂

Vamos dar uma olhada em alguns recursos chave da classe ThreadPoolExecutor:

corePoolSize: o número mínimo de workers para manter vivos.
maximumPoolSize: a capacidade do pool.
keepAliveTime: tempo limite em nanossegundos para threads que estejam ociosas.
workQueue: a fila usada para manter as tasks e entregar para worker threads.
allowCoreThreadTimeOut: usado para aplicar a política de tempo limite à threads principais, desde que o valor keepAliveTime seja diferente de zero.

Como esses atributos estão vinculados?

Uma analogia:

Imagine o pool de threads como uma fábrica;
Core Thread são funcionários em tempo integral da fábrica;
Non-core Threads são os contratados terceirizados;
Blocking Queue (fila de bloqueio) é o pool de tarefas(task pool).

Quando uma task é entregue à fábrica, os funcionários em tempo integral são solicitados primeiro a lidar com as tasks.

Se todos os funcionários estiverem ocupados, a task será colocada no task pool.

Se o task pool estiver cheio, a fábrica solicita aos contratados terceirizados que concluam as tasks.

Se todos os funcionários e contratados estiverem ocupados, a fábrica rejeitará as novas tasks recebidas.

Se os funcionários terceirizados terminarem suas tasks, eles aguardarão um pouco (por exemplo, keepAliveTime) e deixarão a fábrica se nenhuma nova task for dada.

No entanto, parece que os funcionários em tempo integral estão esperando e trabalhando para sempre.

A fábrica decide liberar os funcionários em tempo integral depois de algum tempo, como contratados terceirizados, ativando o switch allowCoreThreadTimeOut.

Vantagem:

Performance, pois não há necessidade de criar novas threads.


Espero ter ajudado e ter proporcionado uma boa leitura.

Obrigado.

Published by Ivan Marrêta

Software Engineer

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: