"Olá, amigo! Temos um tópico novo e muito difícil. Desculpe. Muitas vezes é considerado um dos tópicos mais complexos não só em Java, mas também na programação em geral. Estou falando de multithreading . "

Imagine um jogo de computador típico, por exemplo, um jogo de corrida de nave espacial. Você está voando pelas extensões do cosmos, desviando de meteoritos e cruzadores de patrulha. Duas dúzias de outros estão participando com você nessas corridas ilegais.

Digamos que você decida escrever tal jogo. Seu programa terá que acompanhar os comandos (entrada de teclado), mover as espaçonaves, calcular suas trajetórias, determinar as consequências de eventuais colisões e desenhar tudo isso na tela do usuário. Este é um trabalho muito complexo.

Lembra como resolvemos o «problema de grande complexidade» no exemplo da empresa de navegação em crescimento?

Dividimos em departamentos independentes e especificamos rigidamente (padronizamos) como eles poderiam interagir.

"Mas o que fazemos quando as partes independentes precisam realizar algum trabalho em paralelo com as outras partes?! A resposta para essa pergunta é threads ."

Tente imaginar um programa como um pequeno robô que roda em torno do código e executa comandos . Primeiro, ele executa um comando em uma linha, depois passa para a próxima e assim por diante.

"Eu posso ver isso em minha mente. Pedaço de bolo!"

"Muito bom. E agora imagine que você tem vários desses robôs. Enquanto um está lidando com a entrada do usuário, um segundo está atualizando objetos com base nessa entrada. Um terceiro executa o código para exibir esses objetos na tela. Várias vezes por segundo, um quarto verifica se algum navio colidiu e, se tiver, calcula os resultados da colisão."

Assim, podemos não apenas dividir o programa em partes/objetos independentes, mas também fazer com que essas partes possam realizar seu trabalho independentemente umas das outras. Quanto menos interação entre as partes individuais, menos complexo o programa.

Imagine que você conseguiu substituir o gerente por um script que envia cartas . E os outros departamentos da empresa nem perceberam que houve uma mudança. Esse tipo de coisa aconteceu já no século 26 com excelentes resultados. A maioria dos gerentes e até mesmo os altos executivos podem ser substituídos com sucesso por um script de complexidade média. Somente após a intervenção do «sindicato do plâncton de escritório» é que as demissões em massa de gerentes chegaram ao fim. Mas eu discordo.

"Que interessante!"

"Não só pode haver vários desses "pequenos robôs" executando código, como também podem se comunicar uns com os outros e gerar novos robôs."

"Desenvolver novos robôs?"

"Sim, para realizar novas tarefas. Às vezes é vantajoso criar outro robô (outra thread) para executar alguma ação ao mesmo tempo que a thread atual (robô)."

" Isso soa como uma coisa boa, mas não consigo pensar onde poderia usá-lo. "

E por que os chamamos de « threads »?

"Imagine que cada robô é de uma cor diferente e marca os comandos com sua cor à medida que os executa. O caminho percorrido pelo pequeno robô é como a linha deixada por um lápis. Esse caminho segue atrás do robô, como um fio atrás uma agulha."

Cada «pequeno robô» tem uma tarefa para a qual foi criado. Você pode pensar que um thread é o conjunto de comandos executados durante a execução dessa tarefa.

Digamos que você esteja voando em uma nave espacial para entregar carga. Então «entregar carga» é a sua tarefa, e você está no meio de realizá-la. E a sua trajetória de voo é o seu fio. Poderíamos dizer que cada nova tarefa, cada tarefa ainda não concluída, tem seu próprio fio (um caminho que ainda precisa ser percorrido).

"Em outras palavras, existe uma tarefa e um 'pequeno robô' que a executa. E um fio é apenas o caminho percorrido pelo robô enquanto ele completa sua tarefa?"

"Exatamente."

É assim que tudo funciona lá no fundo. Como o computador possui apenas um processador, ele só pode executar um comando por vez. Então, eis o que acontece: o processador alterna constantemente entre os threads. Ele alterna para um novo thread, executa alguns comandos, depois alterna para o próximo thread, executa alguns comandos e assim por diante. Mas como a alternância entre os threads ocorre centenas de vezes por segundo, parece-nos que todos os threads estão sendo executados simultaneamente.

Multithreading - 1