Mais uma de thread....[Resolvido]

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?

[code]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();
		}
	}
}

}[/code]

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

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?

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:

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.

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 .

agora entendi, viajei nessa questão…obrigada