[tutorial] threads em java

Postagem de conteúdo sobre programação java
Post Reply
User avatar
Kodo no Kami
Admin
Admin
Posts: 641
Joined: Fri Jan 02, 2015 1:56 pm
Contact:

[tutorial] threads em java

Post by Kodo no Kami » Sun Oct 22, 2017 4:32 am

e ae galera blz? nesse tutorial vamos aprender como criar threads em java a pedido do Lucas_Gamer13. uma thread seria um forma de executar trechos do codigo de forma paralela naquele programa, isso evita do programa ficar preso em um determinado loop e ter que esperar terminar para conseguir executar aquele outro trecho de codigo, threads seria como ter um subprocesso do mesmo porem, compartilhando o mesmo trecho de memoria daquele programa. uma das formas de criar threads em java seria criar uma classe que vamos rodar em paralelo, nessa classe temos que implementar a interface Runnable

Code: Select all

class NovaThread implements Runnable{
}

public class Principal {
    public static void main(String[] args) {
    }
}
naquela classe tambem temos que criar um metodo run que sera executado quando a thread for iniciada

Code: Select all

class NovaThread implements Runnable{
    public void run(){
    }
}

public class Principal {
    public static void main(String[] args) {
    }
}
na nossa classe principal a gente instancia um objeto daquela classe

Code: Select all

class NovaThread implements Runnable{
    public void run(){
    }
}

public class Principal {
    public static void main(String[] args) {
	NovaThread nova = new NovaThread();
    }
}
instanciamos um objeto do tipos Thread passando como argumento o objeto que vamos usar como a thread

Code: Select all

class NovaThread implements Runnable{
    public void run(){
    }
}

public class Principal {
    public static void main(String[] args) {
	NovaThread nova = new NovaThread();
	Thread minhathread = new Thread(nova);
    }
}
agora podemos iniciar ela com o metodo start

Code: Select all

class NovaThread implements Runnable{
    public void run(){
    }
}

public class Principal {
    public static void main(String[] args) {
	NovaThread nova = new NovaThread();
	Thread minhathread = new Thread(nova);
	minhathread.start();
    }
}
no exemplo anterior tanto a minha classe principal quanto a minha classe NovaThread estara rodando de forma paralela ao mesmo tempo. para mostrar isso vou prender as duas classes em um loop infinito e ter uma saida

Code: Select all

class NovaThread implements Runnable{
    public void run(){
	while(true){
	    System.out.println("kami");
	}
    }
}

public class Principal {
    public static void main(String[] args) {
	NovaThread nova = new NovaThread();
	Thread minhathread = new Thread(nova);
	minhathread.start();
	
	while(true){
	    System.out.println("kodo");
	}
    }
}
Image

podemos criar quantas threads a gente quiser

Code: Select all

class NovaThread implements Runnable{
    public void run(){
	while(true){
	    System.out.println("kami");
	}
    }
}

class OutraThread implements Runnable{
    public void run(){
	while(true){
	    System.out.println("nova thread");
	}
    }
}

public class Principal {
    public static void main(String[] args) {
	NovaThread nova = new NovaThread();
	OutraThread outra = new OutraThread();
	
	Thread minhathread = new Thread(nova);
	Thread minhathread2 = new Thread(outra);
	
	minhathread.start();
	minhathread2.start();
	
	while(true){
	    System.out.println("kodo");
	}
    }
}
outra forma de usar thread seria herdar a classe Thread

Code: Select all

class NovaThread extends Thread{
    public void run(){
	while(true){
	    System.out.println("kami");
	}
    }
}

public class Principal {
    public static void main(String[] args) {
	NovaThread nova = new NovaThread();
	Thread minhathread = new Thread(nova);
	minhathread.start();
	
	while(true){
	    System.out.println("kodo");
	}
    }
}
um dos problemas em usar threads no programa seria os exemplos anteriores, onde não sera exibido sequencialmente a saida e sim existe a possibilidade de uma ou outra saida ser exibida naquele momento, embora ambas esteja sendo executadas ao mesmo tempo so podemos ter uma unica saida. outro problema que pode surgir por causa do uso das threads é uma vuln chamada de race condition onde tentamos modificar um determinado estado de forma paralela que depende do valor atual do proprio estado sendo que o valor atual vai ser o mesmo em ambos, um exemplo seria uma variavel global onde incrementamos ela usando duas threads, se ambas as threads acabar lendo o valor atual ao mesmo tempo exemplo o valor 0 então ambas as threads tera o valor 0 para ser incrementado, depois de incrementar esse valor e armazenar ele na variavel o resultado final naquela variavel sera o numero 1 e nao o 2 como deveria ser. existem meios de contornar esses problemas de sincronização como mutex, semaforos e filas.

by kodo no kami
Image

Conheça o sistema e manipule ele, se limite ao sistema e seja manipulado por ele ~kodo no kami

meu perfil yahoo

Post Reply

Return to “Java”