Tutoriais Java

Java HOME Introdução ao Java Java Começar Sintaxe Java Comentários Java Variáveis ​​Java Tipos de dados Java Cast de tipo Java Operadores Java Strings Java Java Math Java Booleanos Java Se... Senão Comutador Java Java While Loop Java para loop Java Break/Continuar Matrizes Java

Métodos Java

Métodos Java Parâmetros do método Java Sobrecarga do método Java Escopo Java Recursão Java

Classes Java

Java OOP Classes/objetos Java Atributos de classe Java Métodos de classe Java Construtores Java Modificadores Java Encapsulamento Java Pacotes Java / API Herança Java Polimorfismo Java Classes internas de Java Abstração Java Interface Java Enumerações Java Entrada de usuário Java Data Java Java ArrayList Java LinkedList Java HashMap Java HashSet Iterador Java Classes Java Wrapper Exceções Java Java RegEx Threads Java Java Lambda

Manipulação de arquivos Java

Arquivos Java Java Criar/Gravar Arquivos Arquivos de leitura Java Java Excluir Arquivos

Java como fazer

Adicionar dois números

Referência Java

Palavras-chave Java Métodos de String Java Métodos matemáticos Java

Exemplos Java

Exemplos Java Compilador Java Exercícios de Java Teste Java Certificado Java


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 Threadclasse 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 Runnableinterface:

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 Threadclasse, 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 Runnableinterface, o encadeamento pode ser executado passando uma instância da classe para Threado 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++;
  }
}