Um conjunto de encadeamentos é um grupo de encadeamentos inativos pré-instanciados que estão prontos para receberem trabalho. Eles são preferidos ao instanciar novos threads para cada tarefa quando há um grande número de tarefas curtas a serem executadas, em vez de um pequeno número de tarefas longas. Isso evita ter que incorrer na sobrecarga de criar um thread um grande número de vezes.
A implementação varia de acordo com o ambiente, mas, em termos simplificados, você precisa do seguinte:
- Uma maneira de criar segmentos e mantê-los em um estado ocioso. Isso pode ser conseguido fazendo com que cada thread espere em uma barreira até que o pool o entregue. (Isso também pode ser feito com mutexes).
- Um contêiner para armazenar os encadeamentos criados, como uma fila ou qualquer outra estrutura que tenha uma maneira de adicionar um encadeamento ao conjunto e extraí-lo.
- Uma interface padrão ou classe abstrata para os segmentos a serem usados no trabalho. Essa pode ser uma classe abstrata chamada
Task
com um métodoexecute()
que faz o trabalho e retorna.
Quando o conjunto de encadeamentos for criado, ele irá instanciar um determinado número de encadeamentos para disponibilizar ou criar novos conforme necessário, dependendo das necessidades da implementação.
Quando o pool recebe um Task
, ele pega um segmento do contêiner (ou aguarda que um fique disponível se o contêiner estiver vazio), entrega um Task
e atende à barreira. Isso faz com que o encadeamento ocioso continue a execução, chamando o método execute()
do Task
que foi fornecido. Quando a execução estiver concluída, o thread retorna ao pool para ser colocado no contêiner para reutilização e, em seguida, encontra sua barreira, colocando-se em repouso até que o ciclo se repita.