Alura PD, bom dia!
No projeto desenvolvido durante o curso, criamos algumas threads trabalhadoras dedicadas ao processamento das contas. Em nosso código, estas threads nunca chamam o método estático Thread::Static(int)
, deste modo, o processamento em cada thread acontece sem pausas.
--
Nós usamos o método Thread::Static(int)
na thread principal - a responsável pela interface gráfica, interação do usuário com os controles/botões/janela do WPF.
A razão de darmos uma pausa na thread principal foi porque precisávamos esperar as threads trabalhadoras terminarem o processamento (I):
while (thread_processamento.IsAlive()) {
Thread.Sleep(250);
}
Outra alternativa (II) seria não fazer nada, dentro deste laço de repetição:
while (thread_processamento.IsAlive()) {
//Faz nada
}
Nenhuma destas alternativas interferem diretamente no processamento das contas, afinal, estamos lidando apenas com a Thread principal, não é mesmo?
Analisando superficialmente, podemos dizer apenas que em (I) o usuário poderia ter a impressão de que o processamento demorou um pouco mais, porque a thread principal estava dormindo enquanto a thread_processamento
terminou seu trabalho (um lag de, no máximo, 250ms).
Acontece que perceberemos, em geral, que o desempenho do código em (I) é maior do que o código em (II). Isso ocorre porque o código thread_processamento.IsAlive()
exige uso da CPU e, dentro de um laço while, temos um uso bastante intenso da CPU. Independente do número de Threads que nossa aplicação usa, o sistema operacional ainda precisa administrar todas estas Threads e executar cada uma delas, então o nosso código intensivo de verificar o estado da thread_processamento
causa um problema de performance e gera um atraso no processamento de todas as outras threads de nossa aplicação.