Java - Threads

De Aulas

Afluentes: Programação em Java

Threads no Java

  • São gerenciadas pelo JVM (Java Virtual Machine).
  • Elas podem ser criadas fazendo um extends da classe Thread ou implementando uma Interface Runnable.
  • A JVM só suporta um processo. Criar um novo processo requer criar uma nova JVM pra rodar esse processo.
  • Toda aplicação Java tem pelo menos uma thread (sem considerar o system thread).
  • Do ponto de vista do desenvolvedor, o programa começa com uma thread, chamada de main thread.
  • A main thread cria novas threads.
  • Cada thread é associada com uma instância da classe Thread.
  • Duas estratégicas possíveis para criar uma thread:
    • Instanciando a classe Thread;
    • Delegando criação/gerência da thread para “executor” (high-level concurrency objects).

Exemplo

  • A aplicação que instâncía uma ou mais Threads deve fornecer o código a ser executado na thread.
  • Estratégia 1: passando um objeto Runnable para o construtor da classe Thread:
1public class HelloRunnable implements Runnable {
2    public void run() {
3        System.out.println("Hello from a thread!");
4    }
5
6    public static void main(String args[]) {
7        (new Thread(new HelloRunnable())).start();
8    }
9}
  • Estratégia 2: fazendo subclass de Thread (que também implementa Runnable):
1public class HelloThread extends Thread {
2    public void run() {
3        System.out.println("Hello from a thread!");
4    }
5
6    public static void main(String args[]) {
7        (new HelloThread()).start();
8    }
9}

Principais métodos da Classe Thread

  • run():executa as atividades de uma thread. Quando este método finaliza, a thread também termina.
  • start(): dispara a execução de uma thread. Este método chamao método run() antes de terminar.
  • sleep(int x): coloca a thread para dormir por x milisegundos.
  • join(): espera o término da thread para qual foi enviada a mensagem para ser liberada.
  • interrupt(): interrompe execuçãoe umahread.
  • interrupted(): verifica se uma thread está ou não interrompida.

Estados da Thread

Estados da thread.png


Exemplo

 1class MyThread extends Thread {
 2    public MyThread(String text) {
 3        super(text);
 4    }
 5
 6    public void run() {
 7        for (int i = 0; i < 5; i++) {
 8            System.out.println(i + ": " + getName());
 9            try {
10                sleep((int) (Math.random() * 2000));
11            } catch (InterruptedException e) {
12                System.out.println("ERROR: " + e.getMessage());
13            }
14        }
15        System.out.println(getName() + " finished");
16    }
17}
18
19class MyThreads {
20    public static void main(String args[]) {
21        new MyThread("First").start();
22        new MyThread("Second").start();
23        new MyThread("Third").start();
24    }
25}