PROGRAMAÇÃO ORIENTADA A OBJETOS. Aula 12 - Threads e Concorrência em Java

Documentos relacionados
PROGRAMAÇÃO ORIENTADA A OBJETOS. Aula 11 - Threads e Concorrência

UNIVERSIDADE FEDERAL RURAL DE PERNAMBUCO Bacharelado em Sistemas de Informação. Processamento Paralelo Threads. Aluno: Wagner Palacio

Sincronização e Comunicação entre Processos. Adão de Melo Neto

Concorrência em Processos

Thread. Thread. Sistemas Operacionais. Leonard B. Moreira. UNIVERSIDADE ESTÁCIO DE SÁ fevereiro, / 41

Sincronização e Comunicação

Sistemas Operacionais. Processos e Threads

Fundamentos de Sistemas Operacionais

Programação de Sistemas em Tempo Real

22/02/2017. Prof. Richard Brosler Revisão sobre a pré-aula Tipos de Concorrências, Sincronização

Programação Concorrente com Thread Java. Luiz Affonso Guedes Sistemas Distribuidos

Sistemas Operacionais (SO)

Sistemas de Informação. Sistemas Operacionais

Aula 2: Tipos de Sistemas Operacionais. Instituto Federal da Bahia Campus Salvador INF009 - Sistemas Operacionais Profª Flávia Maristela

Sistemas Operacionais

Sistemas Distribuídos Aula 3

Gabriel de Oliveira Ramos Roland Teodorowitsch - Orientador

Threads. O que é uma Thread? Paralelismo

Redes de Computadores. Fundamentos de Sistemas Operacionais - 2º Período

Sistemas Operacionais. Prof. Pedro Luís Antonelli Anhanguera Educacional

AULA Nº 08 SISTEMAS OPERACIONAIS. Threads

Processos O conceito de processos é fundamental para a implementação de um sistema multiprogramável. De uma maneira geral, um processo pode ser entend

Estrutura dos Sistemas Operacionais. Adão de Melo Neto

Sistema Operacional. Prof. Leonardo Barreto Campos. 1/30

Técnicas Avançadas de Programação

Sistemas Operacionais. Concorrência

LINGUAGENS LÓGICAS E PROGRAMAÇÃO CONCORRENTE

INTRODUÇÃO AOS SISTEMAS OPERACIONAIS SEMANA 10. Operações nos processos. Processos cooperativos, comunicação entre processos.

Sincronização e Comunicação entre Processos. Adão de Melo Neto

Processos e Threads e em sistemas distribuídos. Prof. Me. Hélio Esperidião

Universidade Estadual de Mato Grosso do Sul UEMS Curso de Ciência da Computação Disciplina de Algoritmos Paralelos e Distribuídos

Sistemas Operacionais Aula 3

Sistemas Operacionais. Prof. Fabio Augusto Oliveira

Sistemas Operacionais Concorrência. Carlos Ferraz Jorge Cavalcanti Fonsêca

Curso: Redes de Computadores

Sistemas Operacionais. Aula 1

Programação Concorrente

Sistema Distribuído. Sistema Distribuído. Aplicações Distribuídas. Conceitos Básicos

Java Standard Edition (JSE)

Fundamentos de Sistemas Operacionais. Threads. Prof. Edwar Saliba Júnior Março de Unidade Threads

Algoritmos Computacionais

Sistemas Operacionais. Universidade Federal de Minas Gerais. Aula 4. Comunicação e Sincronização de Processos

Gerência de Recursos. Gerência do Processador

PROCESSOS. Sistemas Operacionais. Vinícius Pádua

Estrutura dos Sistemas Operacionais. Adão de Melo Neto

Introdução OpenMP. Nielsen Castelo Damasceno

Sistemas de Informação. Sistemas Operacionais

Boas Práticas de Programação Concorrente

Sistemas Operacionais

Introdução aos Sistemas Operacionais. Threads

Aula 6: Comunicação entre processos. Instituto Federal da Bahia INF009 - Sistemas Operacionais Profª Flávia Maristela

Introdução aos Sistemas Operacionais

CONCEITOS BÁSICOS SOBRE NODE.JS

Sistemas Distribuídos

Sistemas Operacionais I

Universidade Federal de Minas Gerais. Sistemas Operacionais. Aula 19. Sistema de Entrada/Saída

Threads. Linguagem Java. Adenilso da Silva Simão 17/05/05

Evandro Deliberal Aula 04

UNIVERSIDADE ESTADUAL VALE DO ACARAÚ- UEVA. Assunto: Programação Concorrente.

Fundamentos de Sistemas Operacionais

Computadores e Programação (DCC/UFRJ)

SOP - TADS Threads. Revisão Ultima aula. Programa em execução Cada processo têm sua própria CPU

SISTEMAS OPERACIONAIS ABERTOS Prof. Ricardo Rodrigues Barcelar

Fundamentos de Sistemas Operacionais

Sistemas Operacionais

SISTEMAS DISTRIBUÍDOS PROCESSOS. Slides cedidos pela professora Aline Nascimento

Redes de Computadores. Fundamentos de Sistemas Operacionais - 2º Período

Unidade 2. Processos Threads Concorrência em Java

Sistemas Distribuídos Aula 2

Comunicação entre Processos

Escalonamento. Eduardo Ferreira dos Santos. Abril, Ciência da Computação Centro Universitário de Brasília UniCEUB 1 / 28

Introdução aos Sistemas Operacionais

MULTITHREADING. Prof.: Michele Nasu Tomiyama Bucci

Modelos de Programação de Tempo Real

TAREFAS COMUNICAÇÃO ENTRE TAREFAS AULA 08 Sistemas Operacionais Gil Eduardo de Andrade

Redes de Computadores. INF201 - Fundamentos de Sistemas Operacionais - 2º Período

Threads em Java. Java Threads. Java Componentes: JVM JVM:

Exercícios Cap I. 1.1, 1.2, 1.3 (somente letras (a), (b) e (c)) , 1.8 e 1.12 IC - UFF

SISTEMA DE ARQUIVOS DO SISTEMA OPERACIONAL

Arquitetura de Microprocessadores

08/08/2016. Metodologia de trabalho Sistema de notas Trabalhos Artigos Celulares Presença Entrega de trabalhos Uso de laboratório

Variáveis em OpenMP. Esbel Tomás Valero Orellana

Sincronização e Comunicação entre Processos

Sistemas Operacionais de Tempo Real. Prof. Andre Luis Meneses Silva

Fundamentos de Sistemas Operacionais

Sistemas Operacionais. Comunicação entre processos

Estrutura do Sistema Operacional

Exclusão Mútua (mutex)

Capítulo 2 Processos e Threads

Métodos Sincronizados

Fundamentos de Sistemas Operacionais

Curso de Programação Distribuída e Paralela 29/09/2008. Informática UFRGS. Sistemas Operacionais II (C. Geyer) Sincronização 1. Pg.

Sistemas Operacionais II. Prof. Gleison Batista de Sousa Aula 01

08/02/2017. Metodologia de trabalho Sistema de notas Trabalhos Artigos Celulares Presença Entrega de trabalhos Uso de laboratório

Introdução a Sistemas Operacionais. Adão de Melo Neto

Conceito Básicos de Programação com Objetos Distribuídos. Programação com Objetos Distribuídos (C. Geyer) Conceitos de POD 1

Estrutura deste arquivo.. Comunicação Interprocesso Parte 1 de 2 - Cap. 2. Introdução 1 CONDIÇÕES DE CORRIDA

Sistemas Operacionais

Sistemas Multiprogramáveis/Multitarefa

Sis i te t mas a O perac a i c o i nai a s um p ouco c d a a h is i tó t ria i. a... SO His i t s ó t r ó ic i o

Transcrição:

Aula 12 - Threads e Concorrência em Java

Conteúdo Programático desta aula Aplicar os conceitos e threads, processos concorrentes e sincronização em pequenos programas. Aplicar e verificar os conceitos de prioridade de execução de cada uma dos threads. Criar e executar um aplicativo de múltiplos threads.

Sincronização 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 comunicamse 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.

Sincronização 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 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 Concorrência 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.

O trabalho síncrono

Produtor / Consumidor Thread Produtor produz um determinado dado, que é disponibilizado em uma área comum. Thread Consumidor deverá buscar nesta área compartilhada o dado produzido. Com isso, cada Thread faz uma parte do trabalho e outra faz a outra.

Produtor / Consumidor sem Sincronização Código do Produtor: Este código guarda a área compartilhada no atributo compartilhado. Na execução, é simulado uma carga de trabalho onde em cada iteração do laço, o produtor precisa dormir um tempo aleatório entre 0 e 3 segundos. Esta simulação pode emular uma consulta no banco, uma leitura de arquivo, um acesso a um dado remoto ou até mesmo uma entrada de dados do dispositivo padrão de entrada. Quando o thread acorda, ele coloca na área compartilhada o dado produzido. Neste caso, estaremos produzindo os números de 1 até 10.

Produtor / Consumidor sem Sincronização Código do Consumidor: Neste código abaixo, faremos um laço para consumir todos os dados produzidos até encontrarmos o último elemento. Como sabemos que o último elemento é o número 10, este laço terá esta regra de parada. Também estaremos simulando uma carga de trabalho no consumidor, que está no momento que colocamos a thread para dormir um espaço de tempo aleatório entre 0 e 3 segundos. A ideia é somar todos os elementos produzidos e guardar este valor em SOMA. Ao terminar, será apresentado o resultado do processamento.

Produtor / Consumidor sem Sincronização Código do Consumidor: Neste código abaixo, faremos um laço para consumir todos os dados produzidos até encontrarmos o último elemento. Como sabemos que o último elemento é o número 10, este laço terá esta regra de parada. Também estaremos simulando uma carga de trabalho no consumidor, que está no momento que colocamos a thread para dormir um espaço de tempo aleatório entre 0 e 3 segundos. A ideia é somar todos os elementos produzidos e guardar este valor em SOMA. Ao terminar, será apresentado o resultado do processamento.

Produtor / Consumidor sem Sincronização Código do Consumidor: Neste código abaixo, faremos um laço para consumir todos os dados produzidos até encontrarmos o último elemento. Como sabemos que o último elemento é o número 10, este laço terá esta regra de parada. Também estaremos simulando uma carga de trabalho no consumidor, que está no momento que colocamos a thread para dormir um espaço de tempo aleatório entre 0 e 3 segundos. A ideia é somar todos os elementos produzidos e guardar este valor em SOMA. Ao terminar, será apresentado o resultado do processamento.

Produtor / Consumidor sem Sincronização Código do Classe de compartilhamento de conteúdo: Neste objeto, que será compartilhado entre o consumidor e produtor, é dada a troca de informação. É criado um atributo que será usado para colocar a informação PRODUTOR e ler a informação - CONSUMIDOR Produtor Dado dado Área Comum Consumidor Dado

Produtor / Consumidor sem Sincronização O resultado não é o que se deseja: o consumidor deve receber cada número exatamente uma vez. Este problema se chama uma condição de corrida Uma condição de corrida é uma situação em que 2 ou mais threads ou processos estão compartilhando dados (lendo ou gravando) e o resultado final depende do tempo do escalonamento dos threads Condições de corrida levam a resultados imprevisíveis e a bugs sutis, difíceis de achar. Um bug é fácil de remover se for reproduzível; quando não o é, o mundo se torna cruel.

Produtor / Consumidor com Sincronização Quando efetuamos a sincronização, os dados só serão consumidos após serem produzidos. Isto se dá porque se não for a vez do thread de trabalhar, ele entrará em espera sendo notificado quando o recurso estiver disponível. Código do Consumidor: Sem alteração Código do Produtor: Sem Alteração Para a sincronização, basta criar uma classe para que a área compartilhada seja sincronizada e faça o controle.

Pro que usar 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!

FIM