Fundamentos de Concorrência e I/O em Java: Q&A Essencial
Classificado em Computação
Escrito em em
português com um tamanho de 4,91 KB
1) V ou F? É possível fazer uma conexão entre dois Socket Servers utilizando Streams invertidas. Justifique.
Falso. Não é possível estabelecer uma conexão direta entre dois Socket Servers, mas sim entre um Socket Server e um Socket Client. Além disso, o conceito de "Stream invertida" não existe neste contexto.
2) Como um Socket Server pode atender vários clientes individualmente com tempo de resposta imediato?
É necessário usar Threads separadas para cada cliente.
3) Duas Threads estão na fila de espera com a mesma prioridade. Qual será alocada?
O escalonamento (scheduling) é determinado pela JVM e pelo Sistema Operacional. Em casos de mesma prioridade, o processo é geralmente sorteado ou decidido por um algoritmo de round-robin (baseado em tempo de execução), mas o comportamento exato pode variar entre implementações de JVM.
4) O que acontece se uma Stream de leitura não for fechada?
O recurso do sistema (como um arquivo ou conexão) não é liberado, podendo causar vazamento de recursos.
5) Quais são as classes abstratas de leitura e escrita de caracteres (char)?
São Reader e Writer.
6) Como podemos enviar e receber dados para um Cliente conectado?
Utilizando as Streams de Entrada (Input Stream) para receber dados e as Streams de Saída (Output Stream) para enviar dados.
7) Quando usar o modificador synchronized?
Se houver mais de uma Thread concorrendo pelo acesso a um ou mais objetos, deve-se usar o modificador synchronized. Assim, apenas uma Thread de cada vez executará o bloco ou método sincronizado. (synchronized é um modificador de método ou bloco).
8) O que acontece se uma Stream de leitura aponta para um arquivo inexistente?
É lançada uma Exceção (geralmente FileNotFoundException ou similar, dependendo da API) indicando que o arquivo/recurso não foi encontrado.
9) Quais são as classes abstratas de leitura e escrita de bytes?
São InputStream e OutputStream.
10) Corrija a frase: "Ao invocar o método accept() em um Socket Server, a Thread corrente pausa até que a Stream se feche."
Correção: Quando se invoca o método accept(), a Thread corrente pausa (bloqueia) até que um Cliente se conecte ao servidor.
11) Descreva o cenário: Uma Thread está na espera e outra está fazendo leitura em um arquivo de disco. O que acontece?
A Thread que está realizando a operação de I/O (Entrada/Saída), como a leitura de disco, entra em um estado de bloqueio (Blocked) enquanto aguarda a liberação do recurso físico. Durante esse bloqueio, a JVM pode alocar tempo de processamento para a outra Thread que estava na espera, permitindo que ela comece a executar.
12) Qual o indicador de Fim de Fluxo de Dados (EOF) para leitura byte a byte e linha a linha?
- Stream Byte a Byte: A leitura de um byte retorna o valor
-1. - Linha a Linha (Readers): O método de leitura de linha retorna
null.
13) Qual a condição para iniciar vários Socket Servers ao mesmo tempo?
É necessário utilizar portas diferentes para cada servidor.
14) Qual a diferença arquitetural entre Threads da JVM e Threads do Sistema Operacional (S.O.)?
As Threads da JVM (também chamadas de processos leves) são gerenciadas pela JVM e rodam dentro do mesmo processo da aplicação Java. Elas são mapeadas para Threads nativas do S.O. (dependendo da implementação). Uma Thread do S.O. é uma unidade de execução gerenciada diretamente pelo sistema operacional, podendo representar uma aplicação completamente separada.
15) Complete e corrija o desenho.
(Esta questão requer um contexto visual que não pode ser fornecido em texto. Em um ambiente de prova, seria necessário completar o diagrama de Threads/Sockets/Streams.)
16) V ou F? Duas Threads rodando o mesmo método com variáveis locais terão seus dados misturados. Justifique.
Falso. Variáveis locais são armazenadas na Stack (Pilha) de execução de cada Thread. Como as Threads possuem suas próprias pilhas, os dados locais não se misturam.
17) Ao iniciar uma Thread, invoca-se o método run() ou start()?
Deve-se invocar o método start(). O método run() apenas executa o código na Thread atual, enquanto start() cria e inicia uma nova Thread de execução.