Ybadoo - Soluções em Software Livre
Tutoriais
Programação Orientada a Objetos

Slides

Exercício 06.01 Desenvolva uma classe chamada CountThread para realiar uma contagem simples de 1 até 100, fazendo uma pausa de um segundo antes de apresentar cada número. Além disso, a contagem exibirá uma String a cada dez números impressos. A classe CountThread deve estender a classe Thread, ou como alternativa, implementar a interface Runnable. Reescreva o método run() de Thread para que apresente os números. Use o método estático Thread.sleep() para fazer uma pausa. Um número do tipo long representará os milissegundos (Sierra, 2003).

Exercício 06.02 Nesse problema, você recriará uma das mais belas histórias folclóricas, a saber, a clássica competição entre a lebre e a tartaruga. Você utilizará geração de números aleatórios para desenvolver uma simulação desse memorável evento (Deitel, 2003).

Exercício 06.03 Desenvolva um programa que apresente os números primos existentes entre 0 e 99999. Para cada faixa de dez mil valores, crie uma Thread e dispare o processo para a faixa de valores correspondente.

Exercício 06.04 Desenvolva um programa formado por dois processos concorrentes (threads), chamados leitor e impressor, que executam uma repetição infinita e sincronizam suas ações com o uso de semáforos. O processo leitor fica lendo caracteres do teclado e colocando em um buffer de n posições. Quando o buffer está cheio ou o caractere de quebra de linha for encontrado ('\n') o processo impressor deve imprimir o conteúdo do buffer.

Exercício 06.05 Desenvolva um programa formado por três processos concorrentes, chamados observador, tratador1 e tratador2, que executam uma repetição infinita e sincronizam suas ações com o uso de semáforos. O processo observador lê valores inteiros, que representam a temperatura de um certo dispositivo (Math.random() % 100). Se o valor lido é menor ou igual a 50, deve ser notificado o processo tratador1. Caso o valor seja maior que 50, deve ser notificado o processo tratador2.

Exercício 06.06 Desenvolva um programa concorrente formado por três threads, uma consumidora e duas produtoras, que executam uma repetição eterna. A thread consumidora recebe informações (um valor inteiro) da thread produtora1 no buffer1 e da thread produtora2 no buffer2 (primeiro consome do buffer1 e depois consome do buffer2). Os buffers possuem capacidade de armazenar um único elemento. A thread consumidora somente pode consumir se existirem informações no buffer e as threads produtoras somente podem voltar a produzir depois da thread consumidora haver retirado as informações do buffer.

Exercício 06.07 Desenvolva uma solução de ordenação de vetor onde cada thread é responsável pela ordenação de uma fração deste vetor. O número de threads e o tamanho do vetor devem ser passados por parâmetro para o programa. A função de ordenação deve ser genérica o suficiente para ser associada a cada thread. Tal função de ordenação deve receber por parâmetro uma identificação, bem como o intervalo de operação sobre o vetor. Ao final da ordenação de todas as frações, o processo pai deverá refazer a ordenação, agora sobre todo o vetor de ordenação.

Exercício 06.08 Desenvolva um segmento que apresente os n primeiros termos da sequência yk+1 = yk + (3k2 + 3k + 1), sendo k = 1, 2, 3, ..., n e y1 = 1. O segmento deverá fazer uma pausa de um segundo antes da impressão de cada número. Crie uma classe e estenda Thread. Como alternativa, você pode implementar a interface Runnable. Substitua o método run() de Thread. É aí que entrará o código que exibirá os números. Crie um loop for que seja executado n vezes. Use o método estático Thread.sleep() para fazer uma pausa. Um número do tipo long representará os milissegundos.

Exercício 06.09 Desenvolva uma classe chamada Server para representar um servidor que verifique se determinado número é primo ou não. O servidor recebe requisições dos clientes por uma fila, chamada de Inbox, e armazena as respostas às requisições numa lista, chamada de Outbox. Desenvolva uma classe chamada Client para representar um cliente que requisita ao servidor se determinado número é primo ou não. O cliente insere as requisições na fila Inbox e espera a resposta na lista Outbox. Para testar o funcionamento do sistema, desenvolva uma aplicação com dois servidores e cinco clientes.

Exercício 06.10 Desenvolva um segmento que apresente os n primeiros termos da sequência yk+1 = yk + 2, sendo k = 1, 2, 3, ..., n e y1 = 1. O segmento deverá fazer uma pausa de um segundo antes da impressão de cada número. Crie uma classe e estenda Thread. Como alternativa, você pode implementar a interface Runnable. Substitua o método run() de Thread. É aí que entrará o código que exibirá os números. Crie um loop for que seja executado n vezes. Use o método estático Thread.sleep() para fazer uma pausa. Um número do tipo long representará os milissegundos.

Exercício 06.11 Desenvolva um programa que apresente os números perfeitos existentes entre 0 e 9999. Para cada faixa de mil valores, crie uma Thread e dispare o processo para a faixa de valores correspondente.

Exercício 06.12 Desenvolva um programa que apresente a soma termo a termo de duas matrizes A e B de ordem m × n, denotada por A + B. Para cada linha da matriz resultante, crie uma Thread e dispare o processo para a linha correspondente.