Introdução a Thread na linguagem JAVA
Por: carlos_crla • 28/3/2017 • Trabalho acadêmico • 11.426 Palavras (46 Páginas) • 374 Visualizações
Múltiplas Linhas de Execução
Propriedades de Linha de Execução
Você provavelmente está familiarizado com a multitarefa: a capacidade de ter mais de um programa funcionando no que parece ser simultâneo. Por exemplo, você pode imprimir enquanto edita ou envia um fax. É claro que, a menos que você tenha uma máquina com vários processadores, o que ocorre realmente é que o sistema operacional está repartindo recursos para cada programa, dando a impressão de atividade paralela. Essa distribuição de recursos é possível pois, enquanto o usuário pode pensar que está mantendo o computador ocupado para, por exemplo, introduzir dados, a maior parte do tempo da CPU estará ociosa.
A multitarefa pode ser realizada de duas maneiras, se o sistema operacional interromper o programa sem consultar primeiro ou se os programas são interrompidos apenas quando estão querendo produzir controle. O primeiro caso é chamado de multitarefa preemptiva; o último é chamado de multitarefa cooperativa. O Windows 3.1,
95, 98 e NT são sistemas multitarefa cooperativos e os Unix são preemptivos.
Os programas de múltiplas linhas de execução ampliam a idéia da multitarefa levandoa um nível mais abaixo: os programas individuais parecerão realizar várias tarefas ao mesmo tempo. Normalmente, cada tarefa é chamada de linha de execução (Thread) que é a abreviação de linha de execução de controle. Dizse que os programas que podem executar mais de uma linha de execução simultaneamente são multilinhas, ou têm múltiplas linhas de execução. Considere cada linha de execução como sendo executada em um contexto separado: os contextos fazem paracer que cada linha de execução possui sua própria CPU com registradores, memória e seu próprio código.
Então, qual é a diferença entre múltiplos processos e múltiplas linhas de execução? A diferença básica é que, enquanto cada processo tem um conjunto completo de variáveis próprias, as linhas de execução compartilham os mesmos dados. Isso parece um tanto arriscado e, na verdade, pode ser, conforme você verá posteriormente. Mas é necessário muito menos sobrecarga para criar e destruir linhas de execução individuais do que para ativar novos processos e esse é o motivo pelo qual todos os sistemas operacionais modernos oferecem suporte a múltiplas linhas de execução. Além disso, a comunicação entre processos é muito mais lenta e restritiva do que a comunicação entre linhas de execução.
As múltiplas linhas de execução são extremamente úteis na prática: por exemplo, um navegador deve tratar com vários hosts, abrir uma janela de correio eletrônico ou ver outra página, enquanto descarrega dados. A própria linguagem de programação Java usa uma linha de execução para fazer coleta de lixo em segundo plano evitando assim o problema de gerenciar memória! Os programas GUI têm uma linha de execução separada
para reunir eventos da interface com o usuário do ambiente operacional hospedeiro.
O que são linhas de Execução?
Vamos começar vendo um programa que não utiliza múltiplas linhas de execução e que como conseqüência, torna difícil para o usuário realizar várias tarefas com o programa. Após o dissecarmos, mostraremos então como é fácil fazer esse programa executar linhas de execução separadas. Esse programa anima uma bola que quica continuamente, movendo a bola, descobrindo se ela quica contra uma parede e depois redesenhandoa.
Assim que você clica no botão “Start”, o programa lança uma bola a partir do canto superior esquerdo da tela e a bola começa a quicar. A rotina de tratamento do botão “Start” chama o método bounce() da Classe Ball, que contém um laço executado 1000 vezes. Após cada movimento, chamamos o método estático sleep da classe Thread para fazer uma pausa na bola, por 15 segundos.
class Ball {
public void bounce() {
draw();
for(int i = 1; i <= 1000; i++) {
move();
try { Thread.sleep(5);
} catch(InterruptedException e) { }
}
}
}
A chamada Thread.sleep() não cria uma nova linha de execução – sleep é um método estático da classe Thread que coloca a linha de execução corrente em estado de suspensão.
O método sleep pode lançar uma exceção InterruptedException. Vamos discutir essa exceção e seu tratamento correto posteriormente; vamos apenas ignorála, por enquanto.
Se você executar o programa, poderá ver que a bola quica normalmente, mas assume o controle completo do aplicativo. Se você cansar da bola quicando antes que ela faça isso 1000 vezes e se der um clique no botão “Close”, a bola continuará a quicar. Você não pode interagir com o programa até que a bola tenha terminado de quicar.
Essa não é uma boa situação na teoria ou na prática e está se tornando cada vez mais problemático à medida que as redes se tornam mais importantes. Afinal, quando
você está lendo dados através de uma conexão de rede, é muito comum ficar preso em uma tarefa demorada que você gostaria realmente de interromper. Por exemplo, suponha que você descarregue uma imagem grande e decida, após ver uma parte dela, que não precisa ou não quer ver o restante; você certamente gostaria de poder dar um clique em um botão “Parar” ou “Voltar” para interromper o processo de download.
Vide o código Bounce.Java.
Usando Linhas de Execução para das uma chance às outras tarefas
...