Pular para o conteúdo principal

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:

  1. Estendendo a classe Thread
  2. 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 ou ReentrantLock.
    
    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, como CountDownLatch, CyclicBarrier e ConcurrentHashMap, 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();
        }
    }