–
Threads (Linhas)
Threads e Threading no Java
O que são Linhas?
Uma visão simplista de um computador é a que tem uma CPU que
manipula os dados, uma memória ROM que contém o programa que o CPU
executa, e RAM que segura os dados nos quais o programa opera. Nesta visão
simples, um trabalho é executado de cada vez.
Thread e thread para referenciar a
ideia de execução.
Três Partes de uma Linha
Uma linha inclui três partes principais. Primeiro, há o CPU virtual.
Segundo, há o código que esta CPU está executando. Terceiro, há os dados no
que o código trabalha.
Criando a Linha
Demos uma olhada no modo que uma linha é criada, e discuta como os
argumentos de construção são
usados para prover o código e dados para a linha quando corre.
Começando a Linha
Embora nós criamos a linha, não começa correndo imediatamente. Para
começar isto, nós usamos o método start ( ). Este método está na classe de
Linha, tão determinado nosso esboço prévio que nós simplesmente dizemos.
Thread Sheduling
Embora a linha se torna runnable, necessariamente não começa
imediatamente. Claramente em uma máquina que de fato tem só uma CPU, pode
estar fazendo só uma coisa de cada vez.
Testando uma Linha
Às vezes é possível para uma linha estar em um estado desconhecido. É
possível inquirir se uma linha ainda é viável através do método
isAlive ( ).
Pondo Linhas em Cabo
(Putting Threads on Hold)
Vários mecanismos existem que podem parar a execução de uma linha
temporariamente. Seguindo este tipo de suspensão, execução pode ser retomada
como se nada tivesse interrompido sua execução, a linha aparece ter executado
uma instrução muito lentamente simplesmente.
O método sleep foi introduzido na primeira seção e foi usado para
deter uma linha para um período de tempo.
Às vezes é apropriado suspender execução de uma linha indefinidamente
em qual caso alguma outra linha será responsável para retomar a execução. Um
par de métodos de Linha está disponível para isto. Eles são chamados suspend
() e resume ().
O método join ( ) causa a linha atual para esperar até a linha em qual
o método join é chamado termina.
Outros modos para criar linhas
Nós discutimos criando Linha por uso de uma classe separada que
implementa Runnable. De fato, esta não é a única possível aproximação.
Usando sincronizaram em
Java
O Problema
Imagine uma classe que representa uma pilha. Advertência que a classe não
faz nenhum esforço para dirigir transbordamento ou underflow da pilha, e que a
capacidade de pilha está bastante limitada. Estes aspectos não são
pertinentes a nossa discussão.
A Bandeira de Fechadura de Objeto (The
Object Lock Flag)
Em Java, toda instância de qualquer objeto tem um flag (bandeira)
associado com isto. Esta bandeira pode ser pensada de como uma " bandeira
" de fechadura. Um palavra sincronizado é provido para permitir interação
com esta bandeira.
Reunindo isto
Como foi sugerido, o mecanismo sincronizador () só trabalha se o
programador põe as chamadas nos lugares corretos.
Paralisação completa
Em programas onde linhas múltiplas estão competindo para acesso a
recursos múltiplos, pode haver uma possibilidade de uma condição conhecida
como paralisação completa. Isto acontece quando uma linha está esperando por
uma fechadura segurada por outra linha, mas a outra linha já está esperando
por uma fechadura segurada pela primeira linha.
Enfie Interação (Thread
Interaction)
O Problema
Por que duas linhas poderiam precisar interagir?
A Solução
Toda instância de objeto em Java tem duas tranças de linha associadas
com isto. O primeiro é usado por linhas que querem obter a bandeira de
fechadura, e foi discutido na seção. A segunda trança é usada para
implementar os mecanismos de comunicação de wait () e notify ().
Exercícios
Exercício
01
class
Prog1 extends Thread
{ int a = 0;
public void run(){
for(int r=0;r<7;r++)
{ a = a+1; System.out.println(getName()+"
"+a);}
}
}
class
Prog2 extends Thread
{ int b = 0;
public void run(){
for(int r=0;r<7;r++)
{ b = b+1; System.out.println(getName()+"
"+b);}
}
}
class
Prog1301 { public static void main(String arg[])
{
Prog1 x = new Prog1();
Prog2 y = new Prog2();
x.setName("Paulo");
y.setName("Mario");
x.start(); y.start();
for (int i =0; i<3; i++)
System.out.println("executando o Main");
/*try{x.join(); y.join();} catch(InterruptedException e){} */
}
}
Exercício
02
class
Prog3 extends Thread {
public void run()
{ int a = 0;
for(int r=0;r<7;r++)
{ a = a+1;
System.out.println(getName()+"
"+ a);
}
}
}
class Prog1302 { public static void main(String arg[])
{ Prog3 x = new Prog3();
Prog3 y = new Prog3();
x.setName("Paulo");
y.setName("Mario");
x.start();
y.start();
try{ x.join(); y.join();} catch(InterruptedException e){}
}
}
Capítulo
14 – Java com Rede
Rede com Java
Sockets
Sockets é o nome de um modelo de programação particular, para o vínculo
de comunicação entre processos. Por causa da popularidade deste modelo de
programa, o nome socket foi usada de novo em outras áreas inclusive Java.
Montando a Conexão
Para montar a conexão, uma máquina tem que estar correndo um programa
que está esperando por uma conexão, e o outro fim tem que tentar alcançar o
primeiro. Isto é semelhante a um sistema de telefone; uma festa tem que fazer a
ligação de fato, enquanto a outra festa tem que estar esperando pelo telefone
quando aquela ligação é feita.
Enviando a Conexão
Quando fazemos um telefone chamar, nos precisamos saber o número de
telefone para discar. Quando fazemos uma conexão de cadeia, nos precisamos
saber o endereço ou o nome da máquina distante.
Números de porto
Números de porto em sistemas de TCP/IP são 16 números de pedaço e estão
no alcance 0-65535. Em prática, número de porto debaixo de 1024 é reservado
para serviços predefinidos, e você não os deveria usar a menos que você
deseje comunicar com um desses serviços.
O Modelo de Rede no Java
No idioma de Java, são implementadas conexões TCP/IP com classes no
java.pacote líquido.
Sockets de UDP
Onde TCP/IP é um protocolo conexão-orientado, o Usuário Protocolo de
Datagram é um protocolo de
"connectionless ". Contudo, um modo simples e elegante para pensar nas
diferenças entre estes dois protocolos é a diferença entre o telefone chamada
e correio postal.
DatagramPacket
DatagramPacket tem dois constructors: um para dados receptores e o outro
por enviar dados.