Olá desenvolvedores, hoje começaremos mais uma série, agora falaremos sobre threads e programação paralela ou concorrente. Antes de mais nada precisamos entender o que é programação paralela ou concorrente, para então compreendermos como threads se aplicam a este contexto.

Sabemos que os computadores dos dias atuais possuem um maior poder de processamento. Em linhas gerais isso quer dizer que os processadores estão sendo fabricados com mais de um núcleo. E é neste cenário que a programação paralela ou a programação concorrente se insere.

A concorrência se estabelece, quando por exemplo, um servidor é requisitado por vários clientes, e para poder atender a todos, o servidor escala um determinado tempo para cada um. Aqui eles concorrem lado a lado por memória, por processamento, e outros recursos. No paralelismo, estes mesmos clientes seriam atendidos por vários servidores ao mesmo tempo. Isto é reduzindo dessa forma o tempo de reposta aos clientes e aumentando o ganho em performance.

Em vista disso a plataforma Java nos apresenta um recurso que objetiva possibilitar o trabalho de forma paralela ou concorrente. E este recurso são as threads. Em outras palavras o objetivo das threads pode ser entendido como um processamento paralelo de dados. E isto em suma deixa o usuário livre para executar outras tarefas.

SOBRE THREADS

Obviamente que thread não existe apenas em Java, é um conceito amplamente utilizado também em outras tecnologias. Mas enfim, dentro do escopo do nosso trabalho, um exemplo comum do uso de threads pode ser encontrado, por exemplo, em um sistema de gerenciamento de vendas.

Suponha que o atendente de uma farmácia esteja processando uma venda. Assim, enquanto ele opera o programa várias sub-rotinas são processadas em segundo plano. Dessa forma, objetivando ganhar performance, estes processos são colocados cada um em uma thread. E elas serão executas paralelamente enquanto o atendente segue operando o sistema.

É por isso que threads podem ser definidas como subdivisões de processos, isto é, cada processo possui diversas threads que podem ser executadas ao mesmo tempo. Grosso modo, são as threads que permitem a divisão de um sistema em sub-rotinas de forma que elas possam trabalhar paralelamente. Além disso, é interessante observar que na maioria das vezes este processamento paralelo é transparente para o usuário.

Este processamento que é transparente para o usuário pode ser a leitura e/ou captura de informações, notificação ao usuário. Quando por exemplo, existe a necessidade de um processamento lento e demorado, como o upload de um arquivo, ou o processamento de cinquenta mil registros. Ou ainda quando vários processos precisam ser executados ao mesmo tempo.

O uso de threads é algo muito comum, elas são “presenças” constantes em nosso dia a dia, ainda que não a vejamos. Como exemplo, vamos tomar as dezenas de aplicativos instalados em nossos smartphones. Só para citar alguns, estamos simultaneamente e, o tempo todo, recebendo notificações de e-mails ou mensagens, com várias abas do navegador abertas, escutamos música ao mesmo tempo em que navegamos na internet

Só podemos ter vários aplicativos sendo executados ao mesmo tempo porque existem as threads possibilitando todo este processamento em paralelo.

ENTENDENDO O PODER DAS THREADS

Retomando ao exemplo do processamento de uma venda. Acredito que é senso comum que se todo o processo que envolve a compra/venda for demasiadamente demorado há grandes chances de que o cliente comece a ficar impaciente.

Isso é ruim e não somente porque se torna um processo cansativo tanto para o vendedor como para o cliente. Mas em função de vários transtornos que irão surgir como um efeito em cascata. Filas começarão a se formar, a qualidade do atendimento irá ficar comprometida, clientes poderão vir a desistir da compra. E uma série de outros inconvenientes poderão ocorrer simplesmente porque o software é lento demais.

Então vamos partir do pressuposto de que uma venda deverá ser concluída em 1 minuto, sabemos que não, mas este é apenas um exemplo, então abstraia e segue junto.  Mas para que esta venda possa ser realizada, ou seja, para completar este processo, vários outros processos em threads precisam acontecer no background.

ROTINAS EM PARALELO

Considere as cinco rotinas abaixo as mais comuns em um processo de venda. Assim, o processo começa com a integração do banco de dados, que pode ser entre filiais ou mesmo entre empresas diferentes. Um e-mail com a NFC-E – Nota Fiscal Eletrônica deverá ser envido, ao mesmo tempo tem que ser dada baixa no estoque referente aquela mercadoria, e dependendo do nível do estoque uma comunicação deverá ser feita ao responsável, e um log deverá ser gerado no banco de dados.

Agora imagine você se cada processo citado acima tivesse que ser realizado um por vez. Isto é, um novo processo só poderia ser iniciado quando o anterior estivesse concluído. Quanto tempo este processo demoraria para ser completado? Certamente um tempo que o cliente não está disposto a esperar.

Enfim, este é um problema real se o sistema for desenvolvido sem a implementação de threads. Alguns dos processos que citamos são demorados, outros podem levar apenas alguns segundos, e todos são independentes. Entretanto, com o uso de threads eles podem ser iniciados quase que simultaneamente. E serão processados à revelia do operador do sistema, isto significa que estas rotinas serão executas de forma paralela e transparente. Dessa forma quando as rotinas tiverem sido processadas, teremos concluído a transação de venda.

EM POUCAS PALAVRAS

As threads compreendem um recurso extremamente poderoso e muito útil. E que nos permite trabalhar enquanto tem toda uma “engrenagem” rodando por baixo dos panos, nos bastidores, fazendo a coisa acontecer. E o legal dessas rotinas serem processadas em segundo plano, é que estamos liberados para executar outras tarefas. Ganho de performance para o sistema, ganho de tempo para nós.

Há outro campo onde as threads também são muito usadas, como em desenvolvimento de jogos, principalmente no processo de renderização.

Ao longo dessa série iremos aprende a implementar threads, e você verá que é algo plenamente possível, verá a mágica acontecendo. Eu fico por aqui e nos vemos no próximo tutorial.