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
Upcoming SlideShare
Loading in...5
×

Threads

3,132

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
3,132
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
61
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

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
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×