Dúvida Thread K&B

Olá a todos,

Não entendi muito bem esse exercício de Thread;

public class Messager implements Runnable {
	public static void main(String[] args){
			new Thread(new Messager("Wallace")).start();
			new Thread(new Messager("Gromit")).start();
	}
	private String name;
	public Messager(String name) { this.name = name; }
	public void run() {
		message(1);
		message(2);
	}
	public synchronized void message(int n){
		System.out.println(name + "-" + n + " ");
	}
}

A resposta:
“Ambos os Threads exibirão duas mensagens cada. Wallace-1 deve vir antes de Wallace-2, e Gromit-1 deve vir antes de Gromit-2 Fora isso as mensagens Wallace e Gromit podem vir em qualquer ordem.”

Eu não entendi muito bem o fluxo do programa.

Ele disse o seguinte:

A thread “Wallace” deve imprimir:

"Wallace-1"
“Wallace-2”

A thread “Gromit” deve imprimir:

"Gromit-1"
“Gromit-2”

Só que elas imprimem no mesmo local (o console) e competem pelo seu uso, já que estão rodando em paralelo. Então elas podem imprimir, por exemplo:

"Wallace-1"
"Wallace-2"
"Gromit-1"
“Gromit-2”

ou

"Wallace-1"
"Gromit-1"
"Gromit-2"
“Wallace-2”

ou

"Gromit-1"
"Gromit-2"
"Wallace-1"
“Wallace-2”

ou até mesmo

"Gromit-1"
"Wallace-1"
"Wallace-2"
“Gromit-2”

  • depende muito de como o sistema operacional escolheu as threads para rodarem.

Certo, deixa eu ver se eu entendi.
No caso então o synchronized, não está fazendo diferença?

O synchronized (nesse seu programa, é claro) serve só para não dar problemas do tipo escrever algo como:

[color=red]Wall[/color][color=blue]Gromit-2[/color][color=red]ace-1[/color]

onde uma saída se misturou a outra saída. É pouco provável mas pode ocorrer, por isso é que se usou o synchronized (nesse caso, apenas uma thread consegue imprimir na tela de cada vez.)

Obrigado a todos pela ajuda…