- Herança da Classe Thread
Características:
- Estende diretamente a classe
java.lang.Thread - Sobrescreve o método
run() - Inicia a thread através do método
start()
Vantagens:
- Implementação simples e direta
- Adequado para tarefas básicas de concorrência
Limitações:
- Java não permite herança múltipla, limitando extensibilidade
- Acoplamento entre thread e tarefa reduz flexibilidade
Exemplo de código:
public class MinhaThread extends Thread {
@Override
public void run() {
System.out.println("Thread em execução");
}
}
// Utilização
MinhaThread thread = new MinhaThread();
thread.start();
- Implementação da Interface Runnable
Características:
- Implementa a interface
java.lang.Runnable - Define o método
run() - Requier instância Runnable passada para construtor Thread
Vantagens:
- Contorna limitação de herança única
- Separação entre thread e tarefa aumenta flexibilidade
- Ideal para compartilhamento de recursos entre threads
Limitações:
- Não retorna resultados diretamente
- Não permite lançamento de exceções verificadas
Exemplo de código:
public class TarefaRunnable implements Runnable {
@Override
public void run() {
System.out.println("Tarefa Runnable executando");
}
}
// Utilização
Thread executora = new Thread(new TarefaRunnable());
executora.start();
- Implementação da Interface Callable
Características:
- Implementa a interface
java.util.concurrent.Callable - Define o método
call() - Requer uso de
ExecutorServiceeFuture - Método
call()pode retornar valor e lançar exceções
Vantagens:
- Permite obtenção de resultados da execução
- Suporte a tratamento de exceções
- Adequado para cenários que exigem retorno ou tratamento de erros
Limitações:
- Implementação mais complexa
- Depende de gerenciamento de pool de threads
Exemplo de código:
import java.util.concurrent.*;
public class TarefaCallable implements Callable<String> {
@Override
public String call() throws Exception {
return "Resultado da tarefa Callable";
}
}
// Utilização
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<String> resultadoFuture = executor.submit(new TarefaCallable());
String resultado = resultadoFuture.get(); // Obtém resultado
executor.shutdown();
Comparativo entre Abordagens
| Característica | Thread | Runnable | Callable |
|---|---|---|---|
| Extensão/Implementação | Herança de Thread | Interface Runnable | Interface Callable |
| Retorno de valor | Não | Não | Sim |
| Tratamento de exceções | Try-catch | Try-catch | Lançamento permitido |
| Método de execução | start() direto | Construtor Thread | ExecutorService |
| Flexibilidade | Baixa | Média | Alta |
| Cenários típicos | Tarefas simples | Compartilhamento recursos | Tarefas com retorno |