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

Programacao Concorrente Threads

Embed Size (px)

DESCRIPTION

Threads Concorrência em Java

Citation preview

  • 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)