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:
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.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 -//
PS: per indentare il codice racchiudi il testo tra i tag [*CODE] e [*CODE] senza gli asterishi.