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
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}