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 
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