Dunque l'idea di chi ha scritto il programma è che i due thread in cui agiscono i due ladri si alternino 'vicendevolemnte' nel sottarre denari. Se tutti i denari vengono presi da uno solo dei ladri, la spiegazione sta nel fatto che java, nell'alternare i due thread, assegna un 'tot'di tempo a ciascuno, e probabilmente il tempo assegnato al primo thread è sufficiente a fargli consumare tutti i denari. Per avere un maggiore riscontro dell'alternarsi dei thread in genere li si rallenta con istruzioni tipo:

sleep(xxx);

che fa interrompere un thread per almeno xxx millisecondi, durante tale tempo altri thread in attesa possono essere eseguiti. Quindi prova a modificare il tuo programma cosi:

codice:
//- ProvaThreads.java -//
class ProvaThreads {

	public static int denari=1000;
		public static void main(String[] args) {
		Ladro ladro1=new Ladro();
		Thread t1=new Thread(ladro1);
		Ladro ladro2=new Ladro();
		Thread t2=new Thread(ladro2);
		t1.start();
		t2.start();
	}
}
//- Fine ProvaThreads.java -//

//- Ladro.java -//
class Ladro implements Runnable {

	public void run() {
		int mydenari=0;
		while(ProvaThreads.denari>0) {
			ProvaThreads.denari--;
			mydenari++;
			try{
				Thread.sleep(1);
			}
			catch(InterruptedException e){
				System.out.println(e);
			}
		}
		System.out.println("Ho rubato questi denari: " + mydenari);
	}
}
//- Fine Ladro.java -//
Come vedi ogni ladro 'dorme' per un millisecondo ogni volta che prende un denaro; in qesto modo, visto che i thread sono due e dormono sempre lo stesso tempo, si alternano uno dopo l'altro e alla fine entrambi riescono a prelevare metà del denaro totale. Per introdurre casualità puoi far dormire ciascuno non 1 millisecondo, ma un numero variabile di millisecondi, calcolato casualmente ogni volta, e puoi anche far prelevare un numero casuale di denari.

PS: per indentare il codice racchiudi il testo tra i tag [*CODE] e [*CODE] senza gli asterishi.