Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.
Threads

Elenilson Vieira
Grupo de Estudos da UFPB para a SCJP
elenilson.vieira.filho@gmail.com
O que é Thread?
O que é Thread?
   Linha de Execução

   Um processo A tem duas Thread
       Um processo A tem duas linhas de execução
Entendam como
   um fio no
    processo
Criação de Threads
   Posso extender a classe Thread

   Posso implementar a Interface Runnable
Extendendo Thread
class MyThread extends Thread {
   public void run() {
     System.out.println("Important job running in...
Implementando Runnable
class MyRunnable implements Runnable {
    public void run() {
        System.out.println("Importan...
Basta então criar uma instância de
             Thread?
NÃO!!!
Criação de Threads
   Uma instância da classe Thread é apenas
    uma instância como qualquer outra

   Thread é uma lin...
Em Threads
   A classe Thread possui vários métodos

   Para o exame precisamos entender
       start()
       yield()...
Onde escrevo o código?
Onde escrevo o código?

  public void run() {
    // your job code goes here
  }
Runnable ou Thread?
Runnable ou Thread?
   Qual o melhor?

   Por quê?
Estados da Thread
Estados da Thread
Estado Novo
   Objecto é criado
    mas o start não
    é chamado
Runnable
   Thread está apta a ser executada
Running
   Thread está
    “trabalhando”
Bloqueada

   Thread não é
    elegível para      Chamou o método
    execução               wait()
                   ...
Morta
Como identifico
as Threads?
class NameRunnable implements Runnable {
 public void run() {
    System.out.println("NameRunnable running");
    System.o...
public class NameThread {
    public static void main (String [] args) {
        NameRunnable nr = new NameRunnable();
   ...
public class NameThread {
   public static void main (String [] args) {
     NameRunnable nr = new NameRunnable();
     Th...
public class NameThreadTwo {
  public static void main (String [] args) {
    System.out.println("thread is "
     + Threa...
Múltiplas Threads
class NameRunnable implements Runnable {
   public void run() {
      for (int x = 1; x <= 3; x++) {
          System.out....
public class ManyNames {
    public static void main(String [] args) {
        // Make one Runnable
        NameRunnable n...
Isso é o resultado?
 Running this code might produce the following:
 % java ManyNames
 Run by Fred, x is 1
 Run by Fred, x...
Nem Sempre!
Nem Sempre!
   O escalonador decide

   Cada Thread vai ter o processador a cada
    fatia de tempo

   Não necessariam...
Qualquer uma no estado
RUNNABLE pode ser escolhida!
Podemos parar a execução sem ter
         que matá-la?
Podemos parar a execução sem ter
             que matá-la?
   sleep()

   wait

   yield()
sleep(<long>)
 try {
   Thread.sleep(5*60*1000); // Sleep for 5
 minutes
 } catch (InterruptedException ex) { }
class NameRunnable implements Runnable {
 public void run() {
   for (int x = 1; x < 4; x++) {


     System.out.println("...
public class ManyNames {
        public static void main (String [] args) {
         // Make one Runnable
         NameRun...
Running this code shows Fred, Lucy, and Ricky
alternating nicely:
          % java ManyNames
          Run by Fred
       ...
Prioridades
Prioridades
   Valor de 1 a 10

   Default é 5

   Constantes
       Thread.MIN_PRIORITY (1)
       Thread.NORM_PRIOR...
Método yield()
   Uma determinada thread pode ceder o
    restante de sua fatia de tempo com o
    processador para outra...
Método join()
   Indica para uma Thread A que ela deve parar

   Thread A apenas continua quando a Thread
    B acabar
Como assim?
Sincronização
Slides do Professor Gledson Elias
Classes Thread-Safe
   Dados acessados sáo sincronizados
import java.util.*;
public class NameList {
    private List names = Collections.synchronizedList(
                       ...
public static void main(String[] args) {
    final NameList nl = new NameList();
    nl.add("Ozymandias");
    class NameD...
Como temos os dados
  sincronizados...
Thread t1 executes names.size(), which returns 1.
Thread t1 executes names.remove(0), which returns
Ozymandias.
Thread t2 ...
import java.util.*;
public class NameList {
    private List names = new LinkedList();
    public synchronized void add(St...
Podemos sincronizar
   o objeto todo?
1. class ThreadA {
2.      public static void main(String [] args) {
3.          ThreadB b = new ThreadB();
4.          b....
16. class ThreadB extends Thread {
17.     int total;
18.
19. public void run() {
20.      synchronized(this) {
21.       ...
wait() e
notify()
wait() e wait(<long>)
will have to get the lock for the object:
 synchronized(a){ // The thread gets the lock on 'a'
     ...
notify() e notifyAll()
   notify()
       Notifica uma thread esperando

   notifyAll()
       Notifica todas e quem c...
Threads
Threads
Threads
Threads
Threads
Threads
Prochain SlideShare
Chargement dans…5
×

sur

Threads Slide 1 Threads Slide 2 Threads Slide 3 Threads Slide 4 Threads Slide 5 Threads Slide 6 Threads Slide 7 Threads Slide 8 Threads Slide 9 Threads Slide 10 Threads Slide 11 Threads Slide 12 Threads Slide 13 Threads Slide 14 Threads Slide 15 Threads Slide 16 Threads Slide 17 Threads Slide 18 Threads Slide 19 Threads Slide 20 Threads Slide 21 Threads Slide 22 Threads Slide 23 Threads Slide 24 Threads Slide 25 Threads Slide 26 Threads Slide 27 Threads Slide 28 Threads Slide 29 Threads Slide 30 Threads Slide 31 Threads Slide 32 Threads Slide 33 Threads Slide 34 Threads Slide 35 Threads Slide 36 Threads Slide 37 Threads Slide 38 Threads Slide 39 Threads Slide 40 Threads Slide 41 Threads Slide 42 Threads Slide 43 Threads Slide 44 Threads Slide 45 Threads Slide 46 Threads Slide 47 Threads Slide 48 Threads Slide 49 Threads Slide 50 Threads Slide 51 Threads Slide 52 Threads Slide 53 Threads Slide 54 Threads Slide 55 Threads Slide 56 Threads Slide 57 Threads Slide 58 Threads Slide 59 Threads Slide 60 Threads Slide 61 Threads Slide 62 Threads Slide 63 Threads Slide 64 Threads Slide 65

Threads

  1. 1. Threads Elenilson Vieira Grupo de Estudos da UFPB para a SCJP elenilson.vieira.filho@gmail.com
  2. 2. O que é Thread?
  3. 3. O que é Thread?  Linha de Execução  Um processo A tem duas Thread  Um processo A tem duas linhas de execução
  4. 4. Entendam como um fio no processo
  5. 5. Criação de Threads  Posso extender a classe Thread  Posso implementar a Interface Runnable
  6. 6. Extendendo Thread class MyThread extends Thread { public void run() { System.out.println("Important job running in MyThread"); } }
  7. 7. Implementando Runnable class MyRunnable implements Runnable { public void run() { System.out.println("Important job running in MyRunnable"); } } MyRunnable r = new MyRunnable(); Thread t = new Thread(r);
  8. 8. Basta então criar uma instância de Thread?
  9. 9. NÃO!!!
  10. 10. Criação de Threads  Uma instância da classe Thread é apenas uma instância como qualquer outra  Thread é uma linha de execução  Precisa ser startada  Método start()
  11. 11. Em Threads  A classe Thread possui vários métodos  Para o exame precisamos entender  start()  yield()  sleep()  run()
  12. 12. Onde escrevo o código?
  13. 13. Onde escrevo o código? public void run() { // your job code goes here }
  14. 14. Runnable ou Thread?
  15. 15. Runnable ou Thread?  Qual o melhor?  Por quê?
  16. 16. Estados da Thread
  17. 17. Estados da Thread
  18. 18. Estado Novo  Objecto é criado mas o start não é chamado
  19. 19. Runnable  Thread está apta a ser executada
  20. 20. Running  Thread está “trabalhando”
  21. 21. Bloqueada  Thread não é elegível para  Chamou o método execução  wait()  yield()  sleep()
  22. 22. Morta
  23. 23. Como identifico as Threads?
  24. 24. class NameRunnable implements Runnable { public void run() { System.out.println("NameRunnable running"); System.out.println("Run by " + Thread.currentThread().getName()); } }
  25. 25. public class NameThread { public static void main (String [] args) { NameRunnable nr = new NameRunnable(); Thread t = new Thread(nr); t.setName("Fred"); t.start(); } } Running this code produces the following, extra special, output: % java NameThread NameRunnable running Run by Fred
  26. 26. public class NameThread { public static void main (String [] args) { NameRunnable nr = new NameRunnable(); Thread t = new Thread(nr); // t.setName("Fred"); t.start(); } } Running the preceding code now gives us % java NameThread NameRunnable running Run by Thread-0
  27. 27. public class NameThreadTwo { public static void main (String [] args) { System.out.println("thread is " + Thread.currentThread().getName()); } } which prints out % java NameThreadTwo thread is main
  28. 28. Múltiplas Threads
  29. 29. class NameRunnable implements Runnable { public void run() { for (int x = 1; x <= 3; x++) { System.out.println("Run by " + Thread.currentThread().getName() + ", x is " + x); } } }
  30. 30. public class ManyNames { public static void main(String [] args) { // Make one Runnable NameRunnable nr = new NameRunnable(); Thread one = new Thread(nr); Thread two = new Thread(nr); Thread three = new Thread(nr); one.setName("Fred"); two.setName("Lucy"); three.setName("Ricky"); one.start(); two.start(); three.start(); } }
  31. 31. Isso é o resultado? Running this code might produce the following: % java ManyNames Run by Fred, x is 1 Run by Fred, x is 2 Run by Fred, x is 3 Run by Lucy, x is 1 Run by Lucy, x is 2 Run by Lucy, x is 3 Run by Ricky, x is 1 Run by Ricky, x is 2 Run by Ricky, x is 3
  32. 32. Nem Sempre!
  33. 33. Nem Sempre!  O escalonador decide  Cada Thread vai ter o processador a cada fatia de tempo  Não necessariamente a primeira criada será a primeira escolhida
  34. 34. Qualquer uma no estado RUNNABLE pode ser escolhida!
  35. 35. Podemos parar a execução sem ter que matá-la?
  36. 36. Podemos parar a execução sem ter que matá-la?  sleep()  wait  yield()
  37. 37. sleep(<long>) try { Thread.sleep(5*60*1000); // Sleep for 5 minutes } catch (InterruptedException ex) { }
  38. 38. class NameRunnable implements Runnable { public void run() { for (int x = 1; x < 4; x++) { System.out.println("Run by " + Thread.currentThread().getName()); try { Thread.sleep(1000); } catch (InterruptedException ex) { } } } }
  39. 39. public class ManyNames { public static void main (String [] args) { // Make one Runnable NameRunnable nr = new NameRunnable(); Thread one = new Thread(nr); one.setName("Fred"); Thread two = new Thread(nr); two.setName("Lucy"); Thread three = new Thread(nr); three.setName("Ricky"); one.start(); two.start(); three.start(); } }
  40. 40. Running this code shows Fred, Lucy, and Ricky alternating nicely: % java ManyNames Run by Fred Run by Lucy Run by Ricky Run by Fred Run by Lucy Run by Ricky Run by Fred Run by Lucy Run by Ricky
  41. 41. Prioridades
  42. 42. Prioridades  Valor de 1 a 10  Default é 5  Constantes  Thread.MIN_PRIORITY (1)  Thread.NORM_PRIORITY (5)  Thread.MAX_PRIORITY (10)
  43. 43. Método yield()  Uma determinada thread pode ceder o restante de sua fatia de tempo com o processador para outra thread
  44. 44. Método join()  Indica para uma Thread A que ela deve parar  Thread A apenas continua quando a Thread B acabar
  45. 45. Como assim?
  46. 46. Sincronização
  47. 47. Slides do Professor Gledson Elias
  48. 48. Classes Thread-Safe  Dados acessados sáo sincronizados
  49. 49. import java.util.*; public class NameList { private List names = Collections.synchronizedList( new LinkedList()); public void add(String name) { names.add(name); } public String removeFirst() { if (names.size() > 0) return (String) names.remove(0); else return null; } }
  50. 50. public static void main(String[] args) { final NameList nl = new NameList(); nl.add("Ozymandias"); class NameDropper extends Thread { public void run() { String name = nl.removeFirst(); System.out.println(name); } } Thread t1 = new NameDropper(); Thread t2 = new NameDropper(); t1.start(); t2.start(); }
  51. 51. Como temos os dados sincronizados...
  52. 52. Thread t1 executes names.size(), which returns 1. Thread t1 executes names.remove(0), which returns Ozymandias. Thread t2 executes names.size(), which returns 0. Thread t2 does not call remove(0). The output here is Ozymandias null
  53. 53. import java.util.*; public class NameList { private List names = new LinkedList(); public synchronized void add(String name) { names.add(name); } public synchronized String removeFirst() { if (names.size() > 0) return (String) names.remove(0); else return null; } }
  54. 54. Podemos sincronizar o objeto todo?
  55. 55. 1. class ThreadA { 2. public static void main(String [] args) { 3. ThreadB b = new ThreadB(); 4. b.start(); 5. 6. synchronized(b) { 7. try { 8. System.out.println("Waiting for b to complete..."); 9. b.wait(); 10. } catch (InterruptedException e) {} 11. System.out.println("Total is: " + b.total); 12. } 13. } 14. }
  56. 56. 16. class ThreadB extends Thread { 17. int total; 18. 19. public void run() { 20. synchronized(this) { 21. for(int i=0;i<100;i++) { 22. total += i; 23. } 24. notify(); 25. } 26. } 27. }
  57. 57. wait() e notify()
  58. 58. wait() e wait(<long>) will have to get the lock for the object: synchronized(a){ // The thread gets the lock on 'a' a.wait(2000); // Thread releases the lock and waits for notify // only for a maximum of two seconds, then goes back to Runnable // The thread reacquires the lock // More instructions here }
  59. 59. notify() e notifyAll()  notify()  Notifica uma thread esperando  notifyAll()  Notifica todas e quem consegui o processador vai executar
  • FelippeFarias1

    May. 19, 2017

Vues

Nombre de vues

3 594

Sur Slideshare

0

À partir des intégrations

0

Nombre d'intégrations

69

Actions

Téléchargements

65

Partages

0

Commentaires

0

Mentions J'aime

1

×