Bem-vindo ao Exemplo de Thread em Java. Processo e Thread são duas unidades básicas de execução. A programação de concorrência está mais preocupada com as threads em Java.
Processo
A process is a self contained execution environment and it can be seen as a program or application. However a program itself contains multiple processes inside it. Java runtime environment runs as a single process which contains different classes and programs as processes.
Thread
Thread pode ser chamada de processo leve. A thread requer menos recursos para ser criada e existe no processo; ela compartilha os recursos do processo.
Exemplo de Thread em Java
Cada aplicação Java tem pelo menos uma thread – thread principal. Embora existam muitas outras threads Java em execução em segundo plano, como gerenciamento de memória, gerenciamento de sistema, processamento de sinais, etc., do ponto de vista da aplicação, a principal é a primeira thread Java e podemos criar várias threads a partir dela. Multithreading refere-se à execução simultânea de duas ou mais threads em um único programa. Um processador de núcleo único de computador pode executar apenas uma thread de cada vez, e divisão de tempo é a característica do sistema operacional para compartilhar o tempo do processador entre diferentes processos e threads.
Benefícios das Threads em Java
- As threads em Java são leves em comparação com os processos; levam menos tempo e recursos para criar uma thread.
- As threads compartilham dados e código de seu processo pai
- A troca de contexto entre threads geralmente é menos custosa do que entre processos
- A intercomunicação entre threads é relativamente mais fácil do que a comunicação entre processos
O Java fornece duas maneiras de criar uma thread programaticamente.
- Implementando a interface java.lang.Runnable
- Estendendo a classe java.lang.Thread.
Exemplo de Thread em Java – implementando a interface Runnable
Para tornar uma classe executável, podemos implementar a interface java.lang.Runnable e fornecer implementação no método public void run()
. Para usar essa classe como Thread, precisamos criar um objeto Thread passando o objeto dessa classe executável e então chamar o método start()
para executar o método run()
em uma thread separada. Aqui está um exemplo de thread em Java ao implementar a interface Runnable.
package com.journaldev.threads;
public class HeavyWorkRunnable implements Runnable {
@Override
public void run() {
System.out.println("Doing heavy processing - START "+Thread.currentThread().getName());
try {
Thread.sleep(1000);
// Obter conexão com o banco de dados, excluir dados não utilizados do banco de dados
doDBProcessing();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Doing heavy processing - END "+Thread.currentThread().getName());
}
private void doDBProcessing() throws InterruptedException {
Thread.sleep(5000);
}
}
Exemplo de Thread em Java – estendendo a classe Thread
Podemos estender a classe java.lang.Thread para criar nossa própria classe de thread em Java e substituir o método run()
. Então podemos criar seu objeto e chamar o método start()
para executar o método run da nossa classe de thread personalizada em Java. Aqui está um exemplo simples de thread em Java mostrando como estender a classe Thread.
package com.journaldev.threads;
public class MyThread extends Thread {
public MyThread(String name) {
super(name);
}
@Override
public void run() {
System.out.println("MyThread - START "+Thread.currentThread().getName());
try {
Thread.sleep(1000);
// Obter conexão com o banco de dados, excluir dados não utilizados do banco de dados
doDBProcessing();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("MyThread - END "+Thread.currentThread().getName());
}
private void doDBProcessing() throws InterruptedException {
Thread.sleep(5000);
}
}
Aqui está um programa de teste mostrando como criar uma thread em Java e executá-la.
package com.journaldev.threads;
public class ThreadRunExample {
public static void main(String[] args){
Thread t1 = new Thread(new HeavyWorkRunnable(), "t1");
Thread t2 = new Thread(new HeavyWorkRunnable(), "t2");
System.out.println("Starting Runnable threads");
t1.start();
t2.start();
System.out.println("Runnable Threads has been started");
Thread t3 = new MyThread("t3");
Thread t4 = new MyThread("t4");
System.out.println("Starting MyThreads");
t3.start();
t4.start();
System.out.println("MyThreads has been started");
}
}
A saída do programa de exemplo de thread em Java acima é:
Starting Runnable threads
Runnable Threads has been started
Doing heavy processing - START t1
Doing heavy processing - START t2
Starting MyThreads
MyThread - START Thread-0
MyThreads has been started
MyThread - START Thread-1
Doing heavy processing - END t2
MyThread - END Thread-1
MyThread - END Thread-0
Doing heavy processing - END t1
Uma vez que começamos qualquer thread, a execução depende da implementação do sistema operacional do fatiamento de tempo e não podemos controlar sua execução. No entanto, podemos definir a prioridade das threads, mas mesmo assim não garante que a thread de maior prioridade será executada primeiro. Execute o programa acima várias vezes e verá que não há um padrão no início e no fim das threads.
Runnable vs Thread
Se sua classe oferece mais funcionalidades além de simplesmente ser executada como uma Thread, você deve implementar a interface Runnable para fornecer uma maneira de executá-la como Thread. Se o único objetivo de sua classe é ser executada como Thread, você pode estender a classe Thread. Implementar Runnable é preferível porque o Java suporta a implementação de várias interfaces. Se você estender a classe Thread, não poderá estender nenhuma outra classe. Dica: Como você notou, a thread não retorna nenhum valor. Mas e se quisermos que nossa thread faça algum processamento e depois retorne o resultado para o programa cliente? Confira nosso Java Callable Future. Atualização: A partir do Java 8, Runnable é uma interface funcional e podemos usar expressões lambda para fornecer sua implementação, em vez de usar uma classe anônima. Para mais detalhes, confira Java 8 Functional Interfaces.
Source:
https://www.digitalocean.com/community/tutorials/java-thread-example