Quando executamos um aplicativo do mundo real, usamos bons processadores para uma execução mais rápida. Mas, apenas a velocidade do processador não pode fazer com que seu aplicativo seja executado rapidamente. Uma das ótimas maneiras de criar um aplicativo eficiente em desempenho é utilizar a programação multithreading.
O que é Multithreading?
O multithreading é um conceito de programação no qual o aplicativo pode criar uma pequena unidade de tarefas para executar em paralelo. Se você está trabalhando em um computador, ele executa vários aplicativos e aloca poder de processamento para eles. Um programa simples é executado em sequência e as declarações de código são executadas uma por vez. Isso é um aplicativo de tarefa única. Mas, se a linguagem de programação suporta a criação de várias threads e as envia para o sistema operacional para serem executadas em paralelo, isso é chamado de multithreading.
Multithreading vs Multiprocessing
Quando falamos de multithreading, não nos importamos se a máquina tem um processador de 2 núcleos ou um processador de 16 núcleos. Nosso trabalho é criar um aplicativo multithreaded e permitir que o sistema operacional cuide da alocação e execução. Em resumo, o multithreading não tem nada a ver com o multiprocessing.
Como o Java suporta multithreading?
O Java tem um ótimo suporte para aplicações multithreaded. O Java suporta multithreading através da classe Thread. O Thread do Java nos permite criar um processo leve que executa algumas tarefas. Podemos criar várias threads em nosso programa e iniciá-las. O tempo de execução do Java cuidará de criar instruções de nível de máquina e trabalhar com o sistema operacional para executá-las em paralelo.
Quais são os diferentes tipos de threads?
Há dois tipos de threads em uma aplicação – thread do usuário e thread daemon. Quando iniciamos uma aplicação, a principal é a primeira thread do usuário criada. Podemos criar várias threads do usuário, bem como threads daemon. Quando todas as threads do usuário são executadas, a JVM termina o programa.
O que é Prioridade de Thread?
Quando criamos uma thread, podemos atribuir sua prioridade. Podemos definir prioridades diferentes para threads diferentes, mas não garante que uma thread com prioridade mais alta será executada antes de uma thread com prioridade mais baixa. O agendador de threads faz parte da implementação do sistema operacional, e quando uma thread é iniciada, sua execução é controlada pelo agendador de threads, sem controle por parte da JVM.
Como criar uma thread em Java?
Podemos criar threads tanto implementando a interface Runnable quanto estendendo a classe Thread.
Thread t = new Thread(new Runnable(){
@Override
public void run() {
}
});
Above é uma declaração de uma linha para criar uma nova thread. Aqui estamos criando um Runnable como uma classe anônima. Se você estiver familiarizado com expressões lambda, podemos criar uma thread com código muito mais curto.
Runnable runnable = () -> System.out.println("Hello");
Depois de criar uma thread, é necessário iniciar sua execução chamando o método start().
runnable.start();
I have written a lot of posts explaining the concepts of multithreading in Java. You can go through these in sequence to learn everything about multithreading, its real-life usage, thread lifecycle, thread pool, etc.
1. Java Thread e Runnable
Este é o primeiro post sobre a classe Thread e a interface Runnable. Você também aprenderá sobre Processo e Thread. Qual é a diferença entre Thread e Processo? Benefícios de usar Threads e como podemos criar Threads usando a interface Runnable e a classe Thread. Este post também compara a interface Runnable com a classe Thread.
2. Java Thread Sleep
O Java Thread sleep é usado para pausar a execução da thread atual. Usaremos o Thread sleep extensivamente em posts futuros, então é bom saber como funciona e se é preciso ou não?
3. Java Thread Join
Às vezes, precisamos esperar que outras threads terminem sua execução antes de podermos prosseguir. Podemos alcançar isso usando o método Thread join, aprender como funciona e quando devemos usá-lo.
4. Estados das Threads em Java
Compreender os diferentes estados das threads é importante. Aprenda como uma thread muda de estado e como o agendador de threads do sistema operacional altera o estado de uma thread.
5. Java Thread wait, notify e notifyAll
A classe Object do Java contém três métodos para comunicar o status de bloqueio de um recurso. Aprenda com exemplos de uso desses métodos da classe Object em uma implementação simples de Espera-Notificação.
6. Segurança de Threads e Sincronização
Sabemos que Threads compartilham recursos de objetos, o que pode levar à corrupção de dados, pois essas operações não são atômicas. Aprenda como podemos alcançar a segurança de threads em Java usando diferentes métodos. Leia este post para aprender sobre o uso correto de sincronização, métodos sincronizados e blocos sincronizados.
7. Exceção Java na thread principal
A JVM cria a primeira thread usando o método main. Este post explica algumas exceções comuns que vemos no cotidiano, qual é a causa raiz delas e como corrigi-las.
8. Thread Safety in Singleton Class
Neste artigo, você aprenderá os conceitos básicos de criação de uma classe Singleton. Quais são os problemas de segurança de thread com diferentes implementações? Como podemos alcançar segurança de thread em uma classe Singleton.
9. Daemon Thread in Java
A simple article explaining daemon threads and how we can create daemon threads in java.
10. Java Thread Local
Sabemos que as threads compartilham variáveis de objetos, mas e se quisermos ter variáveis locais à thread criadas no nível da classe? Java fornece a classe utilitária ThreadLocal para criar variáveis locais à thread. Leia mais para aprender como podemos criar variáveis ThreadLocal no programa Java.
11. Despejo de Thread Java
O despejo de thread Java fornece informações sobre a thread atual. Um despejo de thread é útil para analisar problemas de desempenho com a aplicação. Você pode usar o despejo de thread para encontrar e corrigir situações de deadlock. Este post explica diferentes métodos que podem ser usados para gerar despejos de thread em Java.
12. Como Analisar Deadlock em Java
Deadlock é uma situação em que vários threads aguardam uns aos outros para liberar recursos, causando uma dependência cíclica. Este artigo discute a situação em que podemos ter deadlock em um programa Java. Como podemos usar o Thread dump para encontrar o deadlock e as melhores práticas para evitar deadlock em um programa Java.
13. Thread do Temporizador Java
Este post explica como podemos usar as classes Java Timer e TimerTask para criar trabalhos a serem executados em intervalos programados, um programa de exemplo mostrando seu uso e como podemos cancelar o temporizador.
14. Problema Produtor-Consumidor em Java
Antes do Java 5, o problema produtor-consumidor podia ser resolvido usando os métodos wait() e notify(), mas a introdução de BlockingQueue tornou isso muito mais fácil. Aprenda como podemos usar BlockingQueue para resolver o problema produtor-consumidor em Java.
15. Java Thread Pool
O Java Thread Pool é uma coleção de threads trabalhadoras aguardando para processar trabalhos. A introdução do framework Executor no Java 5 tornou muito fácil criar um pool de threads em Java. Podemos usar as classes Executors e ThreadPoolExecutor para criar e gerenciar um pool de threads.
16. Java Callable Future
Às vezes, queremos que nossa Thread retorne alguns valores que podemos utilizar. O Java 5 introduziu Callable, que pode ser usado nesse caso e é semelhante à interface Runnable. Podemos usar o framework Executor para executar tarefas Callable.
17. Exemplo de FutureTask Java
A classe FutureTask é a classe concreta base que implementa a interface Future. Usamo-la com a implementação Callable e Executors para processamento assíncrono. A classe FutureTask fornece métodos de implementação para verificar o estado da tarefa e retornar o valor para o programa chamador assim que seu processamento estiver concluído. É útil quando se deseja substituir alguns dos métodos de implementação da interface Future.
Conclusão
O multithreading é um tópico muito amplo e escrever tudo sobre ele em um único post não seria possível. Se você passar pelos posts acima em sequência, aprenderá tudo sobre multithreading em Java.
Source:
https://www.digitalocean.com/community/tutorials/multithreading-in-java