Programação Avançada (Prova)
Programação Avançada (Prova)
A) Relação entre a classe Java Thread, objetos Thread criados a partir dela e threads
reais de execução.
A classe Java Thread é uma classe abstrata que define uma estrutura básica para a criação
e gerenciamento de threads. Objetos Thread são instâncias da classe Java Thread que
representam threads individuais de execução. Threads reais de execução são unidades de
processamento independentes que podem executar código simultaneamente.
A relação entre esses três conceitos pode ser resumida da seguinte forma:
Em outras palavras, a classe Java Thread define a estrutura para a criação de threads,
enquanto objetos Thread representam essas threads individuais e threads reais de
execução são as unidades de processamento reais que executam o código.
1. Thread-8 count
2. Thread-8 count
3. Thread-8 count
4. Thread-1 count
5. Thread-8 count
6. Thread-1 count
7. Thread-1 count
8. Thread-1 count
9. Thread-1 count
A razão para essa ordem é que a thread Thread-0 termina sua execução antes da thread
Thread-1. Isso ocorre porque a thread Thread-0 tem um atraso menor (500
milissegundos) do que a thread Thread-1 (1000 milissegundos). Como resultado, a thread
Thread-0 é capaz de imprimir suas mensagens na tela antes que a thread Thread-1
tenha a chance de começar a imprimir suas mensagens.
Se a instrução ti.interrupt(); for inserida no final do programa, isso fará com que a
thread Thread-1 seja interrompida. Isso significa que a thread Thread-1 parará de
executar seu código e lançará uma exceção InterruptedException.
Como resultado, a thread Thread-1 não imprimirá mais nenhuma mensagem na tela. A
saída do programa será a seguinte:
1. Thread-8 count
2. Thread-8 count
3. Thread-8 count
4. Thread-1 count
5. Thread-8 count
Isso significa que a thread Thread-1 não é mais capaz de executar seu código, incluindo a
impressão de mensagens na tela.
Questão 2)
A sincronização do método value(), que apenas lê o valor atual de batch, pode parecer
desnecessária à primeira vista. No entanto, existem duas razões pelas quais essa
sincronização pode ser útil:
A palavra-chave volatile pode ser usada como uma alternativa à sincronização para
garantir a visibilidade da memória em variáveis compartilhadas. Ao declarar uma variável
como volatile, o compilador garante que todas as threads vejam o valor mais recente da
variável, mesmo que não haja sincronização explícita.
Questão 3)
O código fornecido no problema pode ser adequado para paralelização, pois apresenta as
seguintes características:
Exemplo de implementação:
this.src = src;
this.dest = dest;
this.start = start;
this.length = length;
@Override
pool.invokeAll(tasks);
}
Questão 4)
Servidor single-threaded:
Vantagens:
Desvantagens:
Servidor multi-threaded:
Vantagens:
Desvantagens:
Programas cliente:
import java.net.*;
import java.io.*;
// Lê a resposta do servidor
byte[] buffer = new byte[1024];
int bytesRead = in.read(buffer);
// Fecha o socket
socket.close();
}
}
Programas servidor:
import java.net.*;
import java.io.*;