[Dúvida] - Threads x Coleções (Ausência de sincronia?)

Olá Guj!

E aí colegas, atualmente tenho tentado desenvolver um programinha para se posicionar imagens na tela. Estou utilizando ele no momento para melhor organização de criação de sprites sheets de jogos. Ele basicamente permite que o usuário insira uma imagem na tela e tenha a possibilidade de movimentar ela ou até de removê-la. As imagens são inseridas em um ArrayList desta forma:

public void adicionarSprite(Sprite sprite)
{
   this.sprites.add(sprite);
}

E são removidas desta forma:

public void removerSprite(int index)
{
   this.sprites.remove(index);
}

Algo bem básico, mas no começo, era funcional. O que acontece é que uso uma classe que extende de um JPanel e esta classe é uma Thread a qual irá demonstrar todos os sprites e permitir a manipulação dos mesmos quando o usuário quiser. Infelizmente, estou ganhando esta mensagem quando compilo o programa:

Exception in thread "Thread-2" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 at java.util.ArrayList.RangeCheck(Unknown Source) at java.util.ArrayList.get(Unknown Source) at entidades.PainelSpritesN.pintarSprSelecionado(PainelSpritesN.java:302) at entidades.PainelSpritesN.atualizarGraficos(PainelSpritesN.java:171) at entidades.NThread.run(NThread.java:78) at java.lang.Thread.run(Unknown Source) Sprite adicionado: Dinossauro Sprite adicionado: Ave
E aqui está o metodo pintarSprSelecionado do qual ele acusa o erro na linha 302:

	/**Pinta sprite selecionado com verde transparente para noção de trabalho.<br>
	 * <b>Condição: Implementado</b>*/
	private void pintarSprSelecionado()
	{
		this.getGraficoTela().setColor(this.corSeletor);
		this.getGraficoTela().fillRect(
				this.sprites.get(this.indexSpriteSelecionado).getPosX() , <-------------------- LINHA 302
				this.sprites.get(this.indexSpriteSelecionado).getPosY() , 
				this.sprites.get(this.indexSpriteSelecionado).getLargura() , 
				this.sprites.get(this.indexSpriteSelecionado).getAltura() );
	}

Eu li na documentação da classe ArrayList: “Note that this implementation is not synchronized.”. Acredito que isso tenha algo nesse meio aí, mas sinceramente, eu não sei. Eu tentei fazer o que a documentação sugeriu:

		this.sprites = new ArrayList(maxSprites);
		List lista = (List) Collections.synchronizedList(this.sprites);

Mas não funcionou. Será que foi por eu não ter trabalhado com o objeto lista? Eu não sei bem. Eu fiz isso e depois fiz todos os algoritmos com o objeto sprites para atualização gráfica e lógica de tela. Esta mensagem que recebo ao compilar o programa aparece como se a lista estivesse vazia. O curioso é que vez ou outra que compilo o programa, ele funciona normal. Mas geralmente aparece essa mensagem e a tela fica preta. Só pode ter algo relacionado com Threads, não concorda? Estou meio perdido.

Quem puder me ajudar, ficarei grato.

Litium.

Oi GUJ.

Pessoal, perdão, eu não prestei atenção numa coisa básica (mas doida). Como o painel é uma Thread, eu fiz para que esta começasse a rodar assim que ela fosse construída mesmo independentemente dos sprites/imagens estarem prontos para manipulação ou não. Antes funcionava por sorte, ou seja, o programa iniciava os objetos antes da Thread começar. Então o que eu fiz foi apenas construir o painel e só depois dos objetos estarem iniciados a Thread do painel ser iniciada.

Isso me levou ao problema de achar que os objetos estavam nulos. É muito estranho isso pois eu mandava um System.out.println(); para aparecer no console se o objeto estava nulo ou não. O console me mostrava que o objeto NÃO estava nulo, mas a mensagem que eu recebia era dizendo que ele estava com certeza nulo. Como um programador vai se tocar na hora? Por sorte, notei isso e pude consertar. Procurei postar aqui assim que resolvi o problema para que vocês tomem ciência do mesmo problema (caso não tenham).

Acredito que isso também não tenha nada a ver com sincronia de Threads. Não tenho mais de uma tarefa acessando valores do meu ArrayList. Ele é total e puramente Single Thread (acredito eu, né).

Achei interessante essa discordância da Thread com a resposta dos objetos. A Thread dizia que eles estavam nulo, e os objetos diziam que eles não estavam. É uma senhora pegadinha isso.

Me desculpem aí qualquer coisa. Obrigado mesmo assim!

Abraços.

Litium