• Nenhum resultado encontrado

CRIANDO THREADSCRIANDO THREADSCRIANDO THREADS

No documento PROGRAMAÇÃO EM JAVA (páginas 78-91)

CRIANDO THREADS CRIANDO THREADS CRIANDO THREADS CRIANDO THREADS

Para criar threads, existem duas formas básicas:

 usando interfaces, em que você pode definir uma classe cujo método run() vai ser executado por um thread;

 usando herança. Sua classe já é um thread que, quando tiver seu método start() chamado, vai executar tudo o que estiver no método run() em paralelo.

Observe o exemplo descrito abaixo:

1. Abra o Eclipse. Acione o botão de inicialização do Metasys, e clique na opção Acessó-rios. Clique em Ferramentas de Programação e, por fim, escolha o aplicativo Eclipse.

2. Para criar um novo projeto, utilize a opção do menu: File/ New e clique em Java Project.

3. Na caixa de texto Project Name, digite o nome do projeto: Exemplo2. Então clique no botão Finish.

4. Clique com o botão direito sobre Exemplo2. Escolha a opção New e clique em Class.

5. Na janela de diálogo, preencha os campos Nome com o texto soma e clique em checkbox public static void main (String [] args). Clique no botão Finish.

6. No editor, apague o código que apareceu e digite os seguintes comandos:

cós terminar o programa, clique com o botão direito do mouse e escolha a opção Compile.

P R O G R A M A Ç Ã O E M J A V A J A V A J A V A J A V A J A V A

80

Para salvar, vá ao menu File e clique em save. Para compilar e executar, vá ao menu Run e clique em run. Se preferir, clique no botão de run, abaixo e menu.

Após terminar o programa, clique com o botão direito do mouse e escolha a opção Compile.

Ao final, solicitamos ao programa central ou principal que aguarde que os Threads terminem seus ciclos para se unir a eles (método join() da classe thread). O método join não retorna enquanto todos os seus threads não terminarem.

Podemos usar threads de várias formas (pausa, parada, retorno à execução etc). Não explicaremos todas aqui. Porém, procure por livros que abordem o assunto.

Alguns assuntos, a exemplo de Threads exigem um conhecimento teórico complexo.

Por isso, sugerimos que você adquira um livro sobre programação concorrente.

Uma outra forma de implementar threads é utilizando a Interface Runnable. Para isso, sua classe precisa implementar o método run().

Então, é preciso instanciar um objeto do tipo Thread, passando como parâmetro o obje-to Runnable. Quando um Thread é construído, usando como argumenobje-to uma classe que implementa a interface Runnable, chamar o método start para esse thread faz com que o método run() de nossa classe comece a ser executado nesse thread paralelo.

public class ContaThread implements Runnable { private int valorInicial = 5;

private static int contaThread = 0;

private int numThread = ++contaThread;

public ContaThread() {

System.out.println(“\nIniciando thread número => “ + contaThread + “\n”);

P R O G R A M A Ç Ã O E M J A V A J A V A J A V A J A V A J A V A

numThread +

“ ( Contagem Atual = “ + valorInicial + “ )”);

for (int j = 0; j < 300000000; j++) {

}

if (—valorInicial == 0) {

System.out.println(

“\nFinalizando thread número => “ + numThread + “\n”);

return;

} } }

private static void contagemRegressiva() throws java.lang.InterruptedException { for (int i = 0; i < 5; i++) {

Thread.sleep(2000);

Runnable ct = new ContaThread();

Thread t = new Thread(ct);

t.start();

}

System.out.println(“\n<< Todas as Threads iniciaram!

>>\n”);

}

public static void main(String[] args) throws java.lang.InterruptedException {

System.out.println(“\n<< Início Principal >>”);

contagemRegressiva();

System.out.println(“<< Fim Principal >>\n”);

} }

82

Até o momento, você estudou os problemas de falta de compartilhamento de dados pelos threads. Eles eram independentes.

Assim, podemos verificar que os threads não pediram acesso a recursos externos ou a chamdas de métodos de outros objetos e ainda, não se preocupavam com o que estava ocorrendo com os outros threads.

Existem situações nas quais os threads devem compartilhar dados e são obrigados a se preocupar com que os outros estão fazendo. Um exemplo que pode gerar erros é o problema clássico de computação chamado Produtor/Consumidor. Nesse problema, existem dois atores: um Produtor que produz um fluxo de dados e um consumidor que consome os dados.

Um exemplo prático desse problema é o seguinte erro: um thread (o produtor) gravar dados num arquivo enquanto outro thread (o consumidor) lê dados do mesmo arquivo.

Nesse caso, temos threads que compartilham um recurso comum. Com tal compar-tilhamento, os threads devem se sincronizar para acessar o recurso.

Vamos ver um passo a passo:

 um produtor gera um número entre 0 e 9 e o armazena num objeto armário;

 o produtor dorme durante um intervalo aleatório entre 0 e 100 ms antes de gerar mais números;

 o consumidor consome os inteiros do mesmo armário, assim que se tornam disponíveis;

 o produtor e o consumidor compartilham dados através de um objeto co-mum da classe armário;

 suponha que não haja sincronização entre os threads. Que problemas pode-riam ocorrer?

 um problema ocorre quando o produtor é mais rápido do que o consumidor e gera dois números antes de o consumidor ter chance de consumir o pri-meiro;

 nessa situação, o consumidor perde um número;

 um outro problema ocorre quando o consumidor é mais rápido do que o produtor;

 um número pode ser consumido duas (ou mais) vezes.

P R O G R A M A Ç Ã O E M J A V A J A V A J A V A J A V A J A V A

Esse problema recebe o nome de “Uma Condição de Corrida”. É uma situação em que duas ou mais threads ou processos estão compartilhando dados (lendo ou gravando) e o resultado final depende do timing do escalonamento dos threads. Uma solução para a condição de corrida é fazer a sincronização dentrro do armário.

Mas é preciso ter atenção a alguns detalhes: os thread nunca devem acessar o armário ao mesmo tempo (mecanismos de lock); o armário somente deve permitir o armazenamento de um novo número quando o primeiro já tiver sido consumido; os threads devem comunicar entrre si para saber que precisa-se de um novo número no armário ou que já existe um número disponível no armário.

A classe Object provê métodos (wait, notify, notifyAll) para permitir que threads esperem por uma condição e notificar outros threads quando uma condição ocorre.

A solução final para o problema é que os métodos ColocaNumeroNoArmario() e RetiraNumeroDoArmario () devem ser especificados como sincronizados. Evite especifi-car métodos muito grandes como sincronizados, pois outros Threads terão que esperar muito tempo para começar a executar.

public synchronized void ColocaNumeroNoArmario () { }

public synchronized Byte RetiraNumeroDoArmario () {

//Byte e uma classe wrapper, ela e igual a null se nao ha elementos

}

Agora, sua classe é segura. Você deve se preocupar apenas com a sincronização dos métodos do seu programa. Os métodos e as classes da linguagem já são escritos para serem Thread safeThread safeThread safeThread safeThread safe, o que gerou muito trabalho para os programadores do Java teamJava teamJava teamJava teamJava team.

Em ambos os casos, o resultado não é o que se deseja: o consumidor deve receber cada número exatamente uma vez.

84

F O R M A Ç Ã O I N I C I A L P A R A O T R A B A L H O

P R O G R A M A Ç Ã O E M J A V A J A V A J A V A J A V A J A V A

BIBLIOGRAFIA BIBLIOGRAFIA BIBLIOGRAFIA BIBLIOGRAFIA BIBLIOGRAFIA

MELLO, Rodrigo. Aprendendo Java 2Aprendendo Java 2Aprendendo Java 2Aprendendo Java 2Aprendendo Java 2. São Paulo: Novatec 2002, 191p.

BROGDEN, Bill; MINNICK, Chris. Guia do Desenvolvedor Java - DesenvolvendoGuia do Desenvolvedor Java - DesenvolvendoGuia do Desenvolvedor Java - DesenvolvendoGuia do Desenvolvedor Java - DesenvolvendoGuia do Desenvolvedor Java - Desenvolvendo e - Commerce com Java Xml e Jsp: Makron Books

e - Commerce com Java Xml e Jsp: Makron Books e - Commerce com Java Xml e Jsp: Makron Books e - Commerce com Java Xml e Jsp: Makron Books

e - Commerce com Java Xml e Jsp: Makron Books, Edição 1/2002, 456p.

COSTA, Luis Carlos Moreira da. JaJaJaJavvvvva para IniciantJa a para Inicianta para Inicianta para Inicianta para Inicianteseseses. Ciência Moderna, 2002,es 80p.

HORSTMANN, Cays; CORNELL, Cornell. Core JaCore JaCore JaCore JaCore Javvvvva 2: Fa 2: Fa 2: Fa 2: Fa 2: Fundamentundamentundamentundamentundamentososososos - vol. 1: Alta Books, 2005, 424p.

FLANAGAN, David. Java: o Guia Essencial.Java: o Guia Essencial.Java: o Guia Essencial.Java: o Guia Essencial.Java: o Guia Essencial. Bookman, 2006, 1099p.

MELO, Ana Cristina. Exercitando Modelagem em UML.Exercitando Modelagem em UML.Exercitando Modelagem em UML.Exercitando Modelagem em UML.Exercitando Modelagem em UML. 51 Exercícios Resolvi-dos: Brasport, 2006, 144p.

http://www.portaljava.com.br http://www.javaman.com.br http://www.javafree.org

http://www.mundojava.com.br http://www.java.com/pt_BR/

http://www.guj.com.br/

http://www.soujava.org.br/

PLANO DE TRABALHO PROGRAMAÇÃO EM JAVA

ANEX

ANEX ANEX

ANEX ANEXOOOOO

Caro professor,

Você está participando de um projeto da Secretaria de Educação que tem como objetivo apresentar as possibilidades da informática na educação, fazendo com que você se familiarize com diferentes aplicativos e os utilize em sala de aula, buscando tornar as suas aulas mais interessantes, criativas e de fácil entendimento.

Várias ferramentas serão trabalhadas neste projeto. Nesse momento, você aprenderá a linguagem de programação Java. Quando concluí-lo, você estará apto a utilizar recur-sos dessa linguagem, para criar programas em várias áreas de forma a tornar suas aulas mais criativas e dinâmicas, além de multiplicar este curso aos os seus alunos.

Procure utilizar o computador para planejar as suas aulas, organizar e apresentar con-teúdos em sala, para pesquisas, elaboração de material didático etc. Quanto mais utilizá-lo, mais estará familiarizado com o recurso e descobrirá, cada vez mais, possibi-lidades de aplicação.

É importante que, ao utilizar a informática nas suas aulas, as orientações repassadas aos alunos sejam bem claras e as atividades bem direcionadas. Defina os temas, objetivos, o tempo de trabalho, metodologia. Em caso de pesquisas na internet, faça uma relação de sites de busca, de temas específicos, imagens etc., e defina o resultado esperado, evitando dispersão da turma e garantindo objetividade no trabalho.

A seguir, foi disponibilizado um “Plano de Trabalho” para orientá-lo no repasse do curso aos seus alunos. Nele, constam os conteúdos que devem ser abordados, sugestão de carga horária, dicas de metodologia e recursos didáticos.

Durante o curso, podem surgir várias idéias de utilização da ferramenta em sala de aula. Não deixe de anotá-las e discutir outras possibilidades com os colegas e instrutor.

Aproveite o curso!

Sucesso!

QUADRO 01

CONTEÚDOS PROCEDIMENTOSPROCEDIMENTOSPROCEDIMENTOSPROCEDIMENTOSPROCEDIMENTOS METODOLÓGICOS 1. Apresentação do Instrutor e

1. Apresentação do Instrutor e1. Apresentação do Instrutor e 1. Apresentação do Instrutor e 1. Apresentação do Instrutor e

Aluno AlunoAluno Aluno Aluno

2. Apresentação Geral do Curso 2. Apresentação Geral do Curso2. Apresentação Geral do Curso 2. Apresentação Geral do Curso 2. Apresentação Geral do Curso - Metodologia de trabalho

- Na era da Informatização - Componentes do Computador Arquivos e Pastas (visão geral) Armazenando Dados em um computador

- Rede Internet - Metasys

Iniciando os Aplicativos do Metasys Introdução ao OpenOffice Writer Introdução ao OpenOffice Calc - Soluções para alguns problemas da Informática

- Qualidade de Vida no Trabalho - Equipamentos

3h

- Exposição dialogada - Dinâmica de apresentação

- Exposição dialogada - Avaliação diagnóstica para verificar o nível de conhecimento da Turma

todos os alunos devem colocar em prática os procedimentos abordados, sob a supervisão do instrutor.

- Laboratório de Informática com Java - Quadro branco/negro e Pincéis

- Apostila - Informática Básica

- Laboratório de Informática com Linux e Java instalados - Quadro branco/negro e pincéis

- Apostila - Informática Básica

No documento PROGRAMAÇÃO EM JAVA (páginas 78-91)

Documentos relacionados