Mais uma de thread....[Resolvido]

6 respostas
giselezr

Ao executar este programa acontece um nullpointer porque Chicks c não é iniciado, porem esta inciando um objeto para c no método go(), alguém pode explicar porque mesmo criando uma instancia de Chicks no método go(), ele não é setado para c?

public class ChicksYach implements Runnable{

	Chicks c;
	
	public static void main(String[] args){
		new ChicksYach().go();
	}
	
	void go(){
		c = new Chicks();
		new Thread(new ChicksYach()).start();
		new Thread(new ChicksYach()).start();
	}
	
	@Override
	public void run() {
		c.yahck(Thread.currentThread().getId());
	}

	
	class Chicks{
		
		synchronized void yahck(long id){
			for (int x = 1; x < 3; x++){
				System.out.println(id + " ");
				Thread.yield();
			}
		}
	}

}

6 Respostas

DaniloAndrade

nesse seu código vc tem três intancias da classe ChicksYach

quando vc faz new ChicksYach().go(); o c é intanciado

mas dentro do metodo go() vc intancias as outras duas ChicksYach() e passa elas como parametro do construtor das treads e da um start e automaticamente os metodo run() da classe ChicksYach() sera executado mas para essa instancia o metodo go() nunca foi chamado e por isso da nullpoiter

drsmachado

Por que este objeto pertence à instância que cria cada uma das threads.

void go(){  
        c = new Chicks();  
        new Thread(new ChicksYach()).start();  
        new Thread(new ChicksYach()).start();  
    }

Ou você instancia c no construtor ou passa o objeto recém criado como argumento do método construtor e, para que seja possível, cria um assim

public ChicksYach(Chicks c){
    this.c = c;
}

Saca?

fabriciov

Apenas no objeto this o c esta inicializado e os runnables passados para as threads são objetos diferentes.
Solução é tornar Chicks c um objeto estático ou oque o amigo disse acima :slight_smile:

rmendes08

Veja bem, cada objeto de uma classe tem suas próprias cópias de suas variáveis de instância. Por exemplo, se eu tenho a classe:

class Pessoa{
  String nome;
  int idade;
}

void main (){
   Pessoa p1 = new Pessoa()
   p1.nome = "joao"; p1.idade = 30;

   Pessoa p2 = new Pessoa();
   p2.nome = "maria"; p2.idade = 22;
}

cada objeto do tipo Pessoa (p1 e p2) tem suas próprias das variáveis nome e idade. No seu caso, você cria um objeto da classe ChicksYack no método main e chama o método go() sobre ele. O método go() por sua vez inicializa a variável c desse objeto, porém, ele cria 2 outros objetos novos e passa cada um para uma thread diferente executar o método run(). O problema é que para esses dois objetos novos, a variável c não está sendo inicializada, pois cada um tem sua própria cópia da variável e ela é inicializada no método go(), que inicializou a variável do objeto criado no método main().

Um jeito simples de resolve esse problema é inicializá-la na mesma linha da declaração ou no construtor.

A

Porque vc não cria um na construtor na classe ChickYach para instanciar o objeto Chick na medida em que uma Thread da Classe é criada . TIpo

public ChickYach () {

c = new Chick();

}

O que vc tá esquecendo é q o objeto Chick tem três cópias , uma da classe ChickYach (ao dar o comando new ChickYach.go()) outras duas das threads ChickYach.start().

Os Objetos Chick das Threads não foram instanciado ainda .

giselezr

agora entendi, viajei nessa questão…obrigada

Criado 29 de janeiro de 2013
Ultima resposta 31 de jan. de 2013
Respostas 6
Participantes 6