public class Pai {
public int a, b;
public void teste1() {
System.out.println("\n1");
}
public void teste2() {
System.out.println("\n2");
}
Pai() //Construtor
{
System.out.println("\nConstrutorPai");
a=1;
b=1;
}
}
public class Filho extends Pai {
public int b,c;
public void teste2() {
System.out.println("\n3");
}
public void teste3() {
System.out.println("\n4");
}
Filho() //Construtor
{
System.out.println("\nConstrutorFilho");
b=2;
c=2;
}
}
Considere o problema o sistema de acervo de livros apresentado anteriormente. Suponha que se deseja um sistema para gerenciar os livros de uma biblioteca, incluindo empréstimos para usuários.
- Desenvolva o diagrama de casos de uso para este problema.
- Projete o diagrama de classes.
Considere o problema tratado no
Trabalho 1:
- Desenvolva o diagrama de casos de uso para este problema.
- Projete o diagrama de classes.
A abordagem a seguir considera que todos os alunos tem bom conhecimento sobre Threads e Processos, bem como os problemas de condições de corrida.
Considere o seguinte código:
public class TesteThread implements Runnable {
private static int cont=1;
private int id;
TesteThread() //construtor
{
id=cont;
cont++;
}
public void run() {
int i;
for (i=0;i<10;i++) {
System.out.printf("\nThread %d - %d",id, i);
try {
Thread.sleep(1000); // thread dorme por 1000 milisegundos
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class Teste {
public static void main(String args[]) {
Thread t;
TesteThread th1;
th1= new TesteThread();
t = new Thread(th1);
t.start();
try {
t.join();
}
catch( Exception e) {
System.out.println("Interrupted");
}
}
}
Com relação ao código acima, responda as seguintes perguntas:
- Compile e execute o código.
- Modifique o código para que o método main da classe teste crie 3 threads. Execute e observe o resultado.
- Procure na documentação da API Java porque foi possível chamar diretamente o método sleep da classe Thread.
- Procure na documentação da API Java porque é obrigatório o uso do try {...} catch {...} na chamada do método sleep da classe Thread. Romova o try {...} catch {...}, tente compilar e observe o resultado.
- Procure na documentação da API Java qual a função do método join utilizado na classe Teste.
- Re-escreva a classe TesteThread utilizando herança ao invés de usar a interface. Modifique a classe Teste para testar a sua implementação.
Considere o seguinte código:
class ContadorEstatico {
private static int c = 0;
public static void increment() {
c++;
}
public static void decrement() {
c--;
}
public static int getValue() {
return c;
}
}
public class TesteThread1 implements Runnable {
private static int cont=1;
private int id;
TesteThread1() //construtor
{
id=cont;
cont++;
}
public void run() {
int i;
for (i=0;i<100000;i++) {
ContadorEstatico.increment();
}
}
}
public class Teste1 {
public static void main(String args[]) {
Thread t;
TesteThread1 th1;
th1= new TesteThread1();
t = new Thread(th1);
t.start();
for (int i=0;i<100000;i++) {
ContadorEstatico.decrement();
}
try {
t.join(); // espera pelo fim da thread t
}
catch( Exception e) {
System.out.println("Interrupted");
}
System.out.printf("\nO valor final do contador é: %d\n\n",ContadorEstatico.getValue());
}
}
Com relação ao código acima, responda as seguintes perguntas:
- Analise o código. Qual deveria ser o valor impresso?
- Explique porque o valor impresso foi diferente do previsto.
- Modifique os métodos da classe ContadorEstatico para que eles sejam sincronizados (synchronized).
- Explique o funcionamento da diretiva synchronized do Java.
Considere os programas cliente-servidor disponíveis em
http://www.eletrica.ufpr.br/TE253/Programas/Sockets/.
Modifique a versão Multithread do programa servidor para responder à requisição de um cliente HTTP (browser), da seguinte forma:
- Não processe a requisição e sempre responda com uma mesma mensagem, formatada em da seguinte forma:
---------------
HTTP/1.1 200 OK
Date: Fri, 31 Dec 1999 23:59:59 GMT
Content-Type: text/plain
Content-Length: 8
some-footer: some-value
another-footer: another-value
mensagem
------------------
troque o Content-Type por text/html e envie uma mensagem HTML.
- Não processe a requisição e responda com uma mesma mensagem, formatada em HTML, informando o horário atual (dica. http://www.tutorialspoint.com/java/java_date_time.htm).