Tópicos Java
Os threads do Java são uma parte fundamental do modelo de concorrência do Java, permitindo que várias tarefas sejam executadas simultaneamente em um programa. Um thread é um processo leve que permite a execução paralela do código, melhorando o desempenho e a capacidade de resposta do aplicativo, especialmente em sistemas com vários núcleos.
Uso
Os threads são usados em Java para executar operações em segundo plano sem interromper o fluxo principal do programa. Eles são ideais para tarefas como lidar com a entrada do usuário, realizar cálculos ou gerenciar operações de E/S simultaneamente.
Criando tópicos
O Java oferece duas maneiras principais de criar threads:
- Estendendo a classe
Thread
- Implementando a interface
Runnable
Exemplos
Exemplo 1: Estendendo o Thread
Classe
class MyThread extends Thread {
public void run() {
System.out.println("Thread is running.");
}
public static void main(String[] args) {
MyThread thread = new MyThread();
thread.start();
}
}
Neste exemplo, uma nova classe MyThread
estende a classe Thread
e substitui o método run()
. O método start()
é chamado para iniciar a execução do thread, que chama internamente o método run()
.
Exemplo 2: Implementando o Runnable
Interface
class MyRunnable implements Runnable {
public void run() {
System.out.println("Thread is running.");
}
public static void main(String[] args) {
Thread thread = new Thread(new MyRunnable());
thread.start();
}
}
Aqui, a classe MyRunnable
implementa a interface Runnable
e fornece o método run()
. Um objeto Thread
é criado com uma instância de MyRunnable
e iniciado usando o método start()
.
Exemplo 3: Usando expressões Lambda
public class LambdaThreadExample {
public static void main(String[] args) {
Thread thread = new Thread(() -> {
System.out.println("Thread is running using lambda.");
});
thread.start();
}
}
Este exemplo demonstra a criação de um thread usando as expressões lambda do Java 8, o que simplifica a sintaxe para implementar a interface Runnable
.
Dicas e práticas recomendadas
- Segurança da linha: Garanta que os recursos compartilhados sejam acessados de maneira segura para evitar inconsistências de dados e condições de corrida. Use mecanismos de sincronização como
synchronized
blocks ouReentrantLock
.synchronized (lockObject) { // critical section }
- Evite o uso excessivo: A criação de muitos threads pode levar à exaustão de recursos. Use pools de threads (por exemplo,
ExecutorService
) para gerenciar os threads com eficiência.ExecutorService executor = Executors.newFixedThreadPool(10); executor.execute(new MyRunnable()); executor.shutdown();
- Rescisão graciosa: Implemente um mecanismo para encerrar graciosamente os threads quando eles não forem mais necessários. Use sinalizadores ou interrupções para sinalizar a parada dos threads.
class MyRunnable implements Runnable { private volatile boolean running = true; public void run() { while (running) { // perform task } } public void stop() { running = false; } }
- Use utilitários de simultaneidade de nível superior: Considere o uso dos utilitários de simultaneidade do Java do pacote
java.util.concurrent
, comoCountDownLatch
,CyclicBarrier
eConcurrentHashMap
, para simplificar tarefas complexas de simultaneidade. - Tratar exceções: Sempre trate as exceções no método
run()
para evitar o encerramento inesperado do thread.public void run() { try { // perform task } catch (Exception e) { e.printStackTrace(); } }