Threads, alguem?

Pessoal… como muitos sabem Threads eh um negocio meio dificil de entrar na cabeca… parece que estou entendo bem mais que antes, mas essa ai me deixou doido. porque gera uma execao??

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

public class ChicksYack implements Runnable{
	Chicks c;
	public static void main(String[] ars){
		new ChicksYack().go();
	}
	void go(){
		c = new Chicks();
		new Thread(new ChicksYack()).start();
		new Thread(new ChicksYack()).start();
	}
	public void run(){
		c.yack(Thread.currentThread().getId());
	}
}

porque ele dá NullPointer na referencia c… em c.yack()

Este programa rodaria caso c fosse static…

apesar de criar um objeto c = new … (); //este objeto não é utilizado

Perceba que na criação das Threads é utilizada novos objetos, portanto o c = null.

e quando se tenta acessar método de uma variaavel null ? NullPointerException.

Só completando o que já foi dito, para funcionar, deveria ser algo assim:

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

ou

[code]public class ChicksYack implements Runnable{
Chicks c;

public ChicksYack() {
c = new Chicks();
}

public static void main(String[] ars){
new ChicksYack().go();
}

void go(){
new Thread(new ChicksYack()).start();
new Thread(new ChicksYack()).start();
}

public void run(){
c.yack(Thread.currentThread().getId());
}
}[/code]

Ou seja, o problema não é de Threads…ela é apenas um pano de fundo, para confundir a cabeça do cidadão… :lol: :lol: :lol:

Normal, né? 8)

[code] class Chicks{
synchronized void yack(long id){
for(int x = 1; x < 3; x++){
System.out.print(id + " ");
Thread.yield();
}
}
}

public class ChicksYack implements Runnable{
static Chicks c; //É so bota como estático que roda na sussa, iria imprimir 8 8 9 9, se não tivesse lançado essa Excepetion acertaríamos com a resposta C. e E. do livro.
public static void main(String[] ars){
new ChicksYack().go();
}
void go(){
c = new Chicks();
new Thread(new ChicksYack()).start();
new Thread(new ChicksYack()).start();
}
public void run(){
c.yack(Thread.currentThread().getId());
}
} [/code]