Threads Java
Threads Java
Threads permitem que um programa opere de forma mais eficiente fazendo várias coisas ao mesmo tempo.
Os threads podem ser usados para executar tarefas complicadas em segundo plano sem interromper o programa principal.
Criando um Tópico
Há duas maneiras de criar um thread.
Ele pode ser criado estendendo a Thread
classe e substituindo seu run()
método:
Estender Sintaxe
public class Main extends Thread { public void run() { System.out.println("This code is running in a thread");
}}
Outra maneira de criar um thread é implementar a Runnable
interface:
Implementar sintaxe
public class Main implements Runnable {
public void run() {
System.out.println("This code is running in a thread");
}
}
Tópicos em execução
Se a classe estender a Thread
classe, a thread pode ser executada criando uma instância da classe e chamando seu start()
método:
Exemplo de extensão
public class Main extends Thread {
public static void main(String[] args) {
Main thread = new Main();
thread.start();
System.out.println("This code is outside of the thread");
}
public void run() {
System.out.println("This code is running in a thread");
}
}
Se a classe implementa a Runnable
interface, o encadeamento pode ser executado passando uma instância da classe para Thread
o construtor de um objeto e, em seguida, chamando o
start()
método do encadeamento:
Exemplo de Implementação
public class Main implements Runnable {
public static void main(String[] args) {
Main obj = new Main();
Thread thread = new Thread(obj);
thread.start();
System.out.println("This code is outside of the thread");
}
public void run() {
System.out.println("This code is running in a thread");
}
}
Diferenças entre "estender" e "implementar" Threads
A principal diferença é que quando uma classe estende a classe Thread, você não pode estender nenhuma outra classe, mas implementando a interface Runnable, é possível estender de outra classe também, como: class MyClass extends OtherClass implements Runnable
.
Problemas de simultaneidade
Como os encadeamentos são executados ao mesmo tempo que outras partes do programa, não há como saber em que ordem o código será executado. Quando as threads e o programa principal estão lendo e escrevendo as mesmas variáveis, os valores são imprevisíveis. Os problemas que resultam disso são chamados de problemas de simultaneidade.
Exemplo
Um exemplo de código em que o valor da variável quantidade é imprevisível:
public class Main extends Thread { public static int amount = 0; public static void main(String[] args) { Main thread = new Main(); thread.start(); System.out.println(amount); amount++; System.out.println(amount);
}public void run() { amount++;
}}
Para evitar problemas de simultaneidade, é melhor compartilhar o menor número possível de atributos entre os encadeamentos. Se os atributos precisarem ser compartilhados, uma solução possível é usar o isAlive()
método do encadeamento para verificar se o encadeamento terminou de ser executado antes de usar quaisquer atributos que o encadeamento possa alterar.
Exemplo
Use isAlive()
para evitar problemas de simultaneidade:
public class Main extends Thread { public static int amount = 0; public static void main(String[] args) { Main thread = new Main(); thread.start(); // Wait for the thread to finish while(thread.isAlive()) { System.out.println("Waiting...");
}// Update amount and print its value System.out.println("Main: " + amount); amount++; System.out.println("Main: " + amount);
}public void run() { amount++;
}}