Top Banner
Engenharia de Computação Tópicos Especiais I Programação concorrente: Threads Prof. Jan Erik Natal, 2015.1
24

Programacao Concorrente Threads

Dec 16, 2015

Download

Documents

Junior Medeiros

Threads Concorrência em Java
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
  • Engenharia de ComputaoTpicos Especiais I

    Programao concorrente: Threads

    Prof. Jan Erik Natal, 2015.1

  • Introduo

    2 /24

    Em vrias situaes, precisamos "rodar duas coisas ao mesmo

    tempo". Imagine um programa que gera um relatrio muito grande

    em PDF. um processo demorado e, para dar alguma satisfao

    para o usurio, queremos mostrar uma barra de progresso.

    Queremos ento gerar o PDF e ao mesmo tempo atualizar a

    barrinha.

    Pensando um pouco mais amplamente, quando usamos o

    computador tambm fazemos vrias coisas simultaneamente:

    queremos navegar na internet e ao mesmo tempo ouvir msica.

    A necessidade de se fazer vrias coisas simultaneamente, ao

    mesmo tempo, paralelamente, aparece frequentemente na

    computao. Para vrios programas distintos, normalmente o prprio

    sistema operacional gerencia isso atravs de vrios processos em

    paralelo.

    Em um programa s (um processo s), se queremos executar

    coisas em paralelo, normalmente falamos de Threads.

  • Threads

    3 /24

    uma forma de um processo dividir a si mesmo em

    duas ou mais tarefas que podem ser executadas

    concorrencialmente. O suporte thread fornecido pelo

    prprio sistema operacional, no caso da linha de execuo

    ao nvel do ncleo (em ingls: Kernel-Level Thread (KLT)),

    ou implementada atravs de uma biblioteca de uma

    determinada linguagem, no caso de uma User-Level

    Thread (ULT).

  • Thread x Processos

    4 /24

    Thread Processo

    Mais Leve Mais Pesado

    Recursos compartilhados Recursos Prprios(I/O, ...)

    Enderecamento compartilhado Endereamento Prprio

    Ambiente de execuo Compartilhada Ambiente de Execuo prprio

    Existe dentro de um Processo Possui ao menos um thread

  • Vantagens de usar Threads

    5 /24

    A criao e terminao de uma thread nova em geral

    mais rpida do que a criao e terminao de um

    processo novo;

    A comutao de contexto entre duas threads mais

    rpido do que entre dois processos;

    menos custoso gerenciar threads do que processos;

    Pode prover melhora na performance

    Mltiplas Threads podem compartilhar recursos

    Utiliza multiprocessadores se disponvel

  • Processo Mono e MultiThreads

    6 /24

  • Implementao de Threads

    7 /24

    Nas linguagens de programao o uso de Threads

    feito utilizando bibliotecas:

    Em Java, Threads so implementados como uma

    Classe: pacote java.lang.Thread, que uma

    extenso da Classe Thread.

    Em C e C++, necessitam de biblioteca especifica

    para processamento: POSIX Threads (C) e Boost

    (C++)

  • Exemplo Thread em C

    8 /24

  • Principais Mtodos de uma Thread Java

    9 /24

    run(): o mtodo que executa as atividades de uma

    THREAD. Quando este mtodo finaliza, a THREAD

    tambm termina.

    start(): mtodo que dispara a execuo de uma THREAD.

    Este mtodo chama o mtodo run( ) antes de terminar.

    sleep(int x): mtodo que coloca a THREAD para dormir

    por x milisegundos.

    join( ): mtodo que espera o trmino da THREAD para

    qual foi enviada a mensagem para ser liberada.

    interrupt( ): mtodo que interrompe a execuo de uma

    THREAD.

    interrupted( ): mtodo que testa se uma THREAD est ou

    no interrompida.

  • Estados de uma Thread Java

    10 /24

  • Prioridade de Thread Java

    11 /24

    Em Java, a prioridade determinada com um inteiro

    entre 1 e 10. A prioridade padro o valor 5. 10 a

    maior prioridade e 1 a menor. A THREAD herda a

    prioridade da THREAD que a criou.

    void setPriority(int prioridade);

    int getPriority( );

  • Implementao de uma Thread Java

    12 /24

    Existem duas maneiras de criar explicitamente Threads em Java:

    Estendendo a classe Thread e instanciando um objeto destanova classe:

    Implementando a interface Runnable e passando um objetodesta nova classe como argumento do construtor da classe

    Thread.

    Prefira implementar Runnable a herdar a Thread.

  • Exemplo 1 Estendendo a classe Thread

    13 /24

  • Exemplo 2 Implementando Runnable

    14 /24

  • Implementando Thread Runnable Anonymous

    15 /24

    Existe uma terceira maneira de implementar Thread de

    forma no explicita (fora das classes):

  • Sincronizao de Threads

    16 /24

    Duas ou mais Threads dentro de um programa podem

    acessar ou modificar um mesmo recurso ou dado, isto

    pode produzir um resultado imprevisto e errado devido ao

    problema da concorrncia.

    Desta forma, sincronizar Threads necessrio para

    coordenar e evitar operaes simultneas em um mesmo

    dado.

    Uma maneira simples de resolver isto em Java

    usando a palavra reserva synchronized.

  • Exemplo de cdigo no sincronizado

    17 /24

  • Sincronizao de Threads

    18 /24

    Existem algumas tcnicas para sincronizar Threads

    e/ou processos, todavia estudaremos duas maneiras

    bsicas de sincronizao usando a palavra reserva

    synchronized do Java:

    Mtodos sincronizados

    Blocos sincronizados

  • Mtodos sincronizados

    19 /24

  • Bloco sincronizado

    20 /24

    public class TwoCounters {

    private long c1 = 0, c2 = 0;

    private Object lock1 = new Object();

    private Object lock2 = new Object();

    public void inc1() {

    synchronized(lock1) {

    c1++;

    }

    }

    public void inc2() {

    synchronized(lock2) {

    c2++;

    }

    }

    }

  • Exemplo Sincronizao programa principal

    21 /24

  • Sincronizao 1 exemplo do PrintNumbers

    22 /24

  • Sincronizao 2 exemplo do PrintNumbers

    23 /24

  • Threads Links teis

    24 /24

    http://www.tutorialspoint.com/java/java_thread_synchronization.htm

    http://tutorials.jenkov.com/java-concurrency/synchronized.html

    http://www.caelum.com.br/apostila-java-orientacao-objetos/programacao-

    concorrente-e-threads/

    https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html

    http://www.inf.puc-rio.br/~inf1621/java2.pdf

    http://pt.slideshare.net/marciopalheta/trabalhando-com-threads-em-java

    http://pt.wikipedia.org/wiki/Thread_(ci%C3%AAncia_da_computa%C3%A7%

    C3%A3o)