Prévia do material em texto
- -1 PROGRAMAÇÃO ORIENTADA A OBJETOS THREADS E CONCORRÊNCIA EM JAVA - -2 Olá! Nesta aula, você irá: 1. Aplicar os conceitos e threads, processos concorrentes e sincronização em pequenos programas. 2. Aplicar e verificar os conceitos de prioridade de execução de cada uma dos threads. 3. Criar e executar um aplicativo de múltiplos threads. Introdução Seja bem-vindo à disciplina de Programação Orientado a Objetos. Nesta nona aula estaremos aplicando os conceitos de threads, processos concorrentes e sincronização em pequenos programas. Estaremos também aplicando e verificando os conceitos de prioridade de execução de cada uma das threads. Por fim estaremos desenvolvendo um aplicativo com múltiplas threads. Sincronização de Threads Durante a execução de threads, há casos em que elas trabalham independentemente uma da outra, sem necessidade de qualquer comunicação entre elas. Por outro lado, há casos em que elas comunicam-se de alguma forma ou utilizam dados em comum. Este comportamento gera a necessidade de denominar os threads em assíncronas e síncronas, dependendo da forma de trabalho desempenhada. Threads que trabalham independentes no tempo, são assíncronas enquanto aquelas que trocam informações em tempo de execução são síncronas. As threads se diferem dos processos por poderem ter áreas de dados comuns. Isto pode facilitar em muito a implementação de programas. Porém, pode causar alguns erros quando a mesma base de dados é alterada por mais de um thread, em momentos inesperados. A solução para este problema é utilizar um mecanismo de sincronização que permita a thread acessar a base de dados compartilhada apenas quando os dados estiverem (outras threads não estejam manipulandoestáveis estes dados). Java adotou a palavra chave synchronized para informar que um determinado bloco deve estar síncrono com os demais threads. O sincronismo gera um bloco atômico (indivisível). Assim, este bloco passa a ser protegido, evitando que a thread atual seja interrompida por outro thread, independente da prioridade. • O uso de memória compartilhada entre os threads obriga o programador a sincronizar as ações de suas threads. • Para isso, Java provê monitores ou locks. Imagine um lock como uma permissão para que apenas um • • - -3 threads. • Para isso, Java provê monitores ou locks. Imagine um lock como uma permissão para que apenas um thread possa utilizar um recurso por vez. • Cada objeto em Java possui um lock e ele deve ser obtido através do comando synchronized. Os métodos wait(), notify() e notifyAll() também são muito importantes na sincronização, sendo responsáveis por provocar, respectivamente: uma espera, a liberação de uma ou mais threads em espera. Motivação para programação concorrente Na maioria dos programas que desenvolvemos, criamos programas que na maioria dos casos os processos são assíncronos e quando há alguma complexidade na execução das tarefas, delegamos este processo para a JVM. Ela é a responsável por criar e distribuir os threads do nosso sistema. Mas quando desenvolvemos determinados tipos de aplicativos, onde fica claro que existem uma fonte de recursos e algum outro programa que precisa destes recursos para executar ou gravar algo. Como exemplo, podemos citar a migração de dados de um sistema para outro. Precisamos ler os dados, processar estes dados e, quando estiverem prontos, guardar os dados no novo sistema. Resolvendo este tipo de problema sincronamente, teremos o seguinte trabalho: Eu posso ler de diversas fontes e apenas um centralizador irá gravar. Isso sobrecarrega tanto a leitura, o processamento e a gravação. • • Fique ligado Em muitas situações, threads devem compartilhar dados e são obrigados a se preocuparem com que cada uma está fazendo e em que tempo. Este é um problema típico de programação concorrente. - -4 Este típico problema deve ser tratado com o algoritmo de Produtor / Consumidor Produtor / Consumidor Para começar, vamos entender o algoritmo do Produtor / Consumidor. Neste relacionamento, um Thread Produtor produz um determinado dado, que é disponibilizado em uma área comum. Por sua vez, o Thread Consumidor deverá buscar nesta área compartilhada o dado produzido. Com isso, cada Thread faz uma parte do trabalho e outra faz a outra. Podemos ver na Figura um exemplo típico deste processo: Para ilustrar o problema de uma maneira lúdica, veja a ilustração de Michael Vigneau: - -5 Para mais informações, leia “Produtor / Consumidor sem sincronização”, no link: http://estaciodocente.webaula. com.br/cursos/gon282/docs/14POO_aula09_doc02.pdf Leia também “Produtor / Consumidor com sincronização”: http://estaciodocente.webaula.com.br/cursos /gon282/docs/14POO_aula09_doc01.pdf Para que usar as threads em Java? Existem várias aplicações e usos para os threads. Se a sua aplicação Java for um servidor, como um servidor web por exemplo, você deve estar atendendo a mais de um cliente ao mesmo tempo. Com isso, é possível que você queira uma thread por cliente. Uma aplicação interativa pode precisar executar algo que demora um certo tempo enquanto a interface com o usuário é apresentada em outra thread para avisar que o processador está trabalhando. Às vezes encontramos em nossos programas a execução de trechos independentes, que poderiam ser executados em paralelo. Neste caso, é apropriado cria uma thread para cada parte e executar todas de uma vez, visto que a ordem entre elas não altera o resultado final do meu sistema. Outro aspecto relevante é que cada vez mais, os processadores estão mais rápidos e com um número maior de núcleos. Cada núcleo é capaz de executar uma thread em paralelo. O grande desafio que temos hoje em dia é conseguir paralelizar nossos processos para utilizar todos os recursos de hardware disponíveis! http://estaciodocente.webaula.com.br/cursos/gon282/docs/14POO_aula09_doc02.pdf http://estaciodocente.webaula.com.br/cursos/gon282/docs/14POO_aula09_doc02.pdf http://estaciodocente.webaula.com.br/cursos/gon282/docs/14POO_aula09_doc01.pdf http://estaciodocente.webaula.com.br/cursos/gon282/docs/14POO_aula09_doc01.pdf - -6 O que vem na próxima aula •Desenvolvimento de Aplicativos com Threads, Concorrência e GUI Swing. CONCLUSÃO Nesta aula, você: • Aplicou os conceitos e threads, processos concorrentes e sincronização em pequenos programas. • Aplicou e verificou os conceitos de prioridade de execução de cada uma dos threads. • Criou e executou um aplicativo de múltiplos threads. Saiba mais Para esta aula sugiro as seguintes tarefas: • Leitura do Capítulo 23 (23.6 até 23.7) do livro Java como programar, 6ª Edição, de H. Deitel e P. Deitel, Editora Pearson Education, 2005. • Resolução dos exercícios de 23.5 até 23.9 do capítulo 23 do livro Java Como Programar – 6ª Edição. • • • • • Olá! O que vem na próxima aula CONCLUSÃO