Ir ao conteúdo

Posts recomendados

Postado

Desculpa a pergunta, sou novo em java.

 

Estou tentando usar threads para acessar o mesmo local, e tenho um variavel global (na verdade não sei se existe o conceito de variável global em java).

 

De toda forma, eu tenho uma variável NIngressos que começa igual a 10. O que eu quero é ir atualizando o valor dessa variável...

 

A thread 1, que eu chamo de FABRICA adiciona 3 ao NIngressos, e todas as outras threads diminuem 1 o numero de NIngressos.

 

O que eu gostaria é que o resultado saisse dessa forma:
Numeros de Cartelas Inicial: 10
[Fabrica]Numero atual de: 13
[Comprador 1]Numero atual de: 12
[Comprador 2]Numero atual de: 11
[Comprador 3]Numero atual de: 10
[Comprador 4]Numero atual de: 9
[Comprador 5]Numero atual de: 8

 

Ou seja, que NIngressos seja atualizado. Mas na verdade o que acontecesse é o seguinte:

Numeros de Cartelas Inicial: 10
[Fabrica]Numero atual de: 13
[Comprador 1]Numero atual de: 9
[Comprador 2]Numero atual de: 9
[Comprador 3]Numero atual de: 9
[Comprador 4]Numero atual de: 9
[Comprador 5]Numero atual de: 9

 

É como se todos só tivessem acesso ao valor inicial de NIngressos, e que o valor não vai atualizando.


Código:

 

package com.company;

public class TUDO_EM_UM extends Thread {
	
	public int NIngressos=10;

    public static void main(String[] args) throws Exception{
    	
    	System.out.println("Numeros de Cartelas Inicial: 10");
    	
    	TUDO_EM_UM time1 = new TUDO_EM_UM("Fabrica");
    	TUDO_EM_UM time2 = new TUDO_EM_UM("Comprador 1");
    	TUDO_EM_UM time3 = new TUDO_EM_UM("Comprador 2");
    	TUDO_EM_UM time4 = new TUDO_EM_UM("Comprador 3");
    	TUDO_EM_UM time5 = new TUDO_EM_UM("Comprador 4");
    	TUDO_EM_UM time6 = new TUDO_EM_UM("Comprador 5");

        time1.start();
        time2.start();
        time3.start();
        time4.start();
        time5.start();
        time6.start();
         
    }

    public TUDO_EM_UM(String id) throws InterruptedException{ 
    	
    	super(id);
    	
    }	
    public void run(){
    	
    	//while(true){
    		
    		if(getName()=="Fabrica")
    			this.NIngressos=NIngressos+3;
    		else
    			this.NIngressos=NIngressos-1;

    		System.out.println("["+getName()+"]Numero atual de: "+NIngressos);
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			} 
    				
    	//}   		
		
    } 	
	
}

 

  • Curtir 1
Postado

Opa, tudo bem?

 

Seu código está 99% correto. O que falta aqui é a palavrinha mágica static.

 

Sua variável NIngressos precisa ser estática:

 

public static int NIngressos = 10;

Porque isso? Sendo estática, ela manterá o seu valor atualizado a cada chamada da thread. Da forma como você fez, cada thread instancia a classe com o valor 10 e sempre vai remover 1 da variável.

 

Postado

Obrigado, deu certo, está atualizando o valor. Mas tem algumas incoerências.

 

[Fabrica]Numero atual na bilheteria: 13
[Comprador 2]Numero atual na bilheteria: 12
[Comprador 1]Numero atual na bilheteria: 11
[Comprador 3]Numero atual na bilheteria: 10
[Comprador 4]Numero atual na bilheteria: 9
[Comprador 5]Numero atual na bilheteria: 8 //Até aqui deu certo
[Fabrica]Numero atual na bilheteria: 6            //Mas aqui o valor devia ser 11
[Comprador 4]Numero atual na bilheteria: 4
[Comprador 5]Numero atual na bilheteria: 3
[Comprador 3]Numero atual na bilheteria: 4
[Comprador 2]Numero atual na bilheteria: 6
[Comprador 1]Numero atual na bilheteria: 6
[Fabrica]Numero atual na bilheteria: 5

 

Como faz para apenas um acessar a região critica por vez?

Postado

Eu fiz aqui e deu certo. Você apenas precisar dar um new em cada variável novamente e depois executar. 

 

No seu bloco principal, eu apenas fiz 

//SEU CODIGO ANTERIOR ACIMA, COM A EXECUÇÃO padrão ATE TERMINAR EM 8 INGRESSOS
		time1 = new TUDO_EM_UM("Fabrica");
    	time2 = new TUDO_EM_UM("Comprador 1");
    	time3 = new TUDO_EM_UM("Comprador 2");
    	time4 = new TUDO_EM_UM("Comprador 3");
    	time5 = new TUDO_EM_UM("Comprador 4");
    	time6 = new TUDO_EM_UM("Comprador 5");
        
        time1.start();
        time3.start();
        time5.start();
        time2.start();
        time4.start();
        time6.start();

e para garantir a ordem de execução sem nenhum tipo de problema, altere seu método run() para

 

public synchronized void run(){

Com o synchronized, as execuções das threads ocorrem sem que uma se "intrometa" com a chamada de outra.

 

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...