PDA

Visualizza la versione completa : [JAVA] Threads


useralex
01-01-2005, 17:09
Ciao ragazzi buon anno. Sto cercando di imparare la programmazione concorrente in Java ma ancora non riesco a capirci molto. Ho un progetto come questo:

//- ProvaThreads.java -//
class ProvaThreads {
public static int denari=100000;
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++;
}
System.out.println("Ho rubato questi denari: " + mydenari);
}
}
//- Fine Ladro.java -//

I due ladri dovrebbero rubare i denari in modo concorrente e quindi "fare un pò per ciascuno". Invece la stampa che il programma mostra è che solo un ladro ruba tutti i denari. Perchè? Ho pensato che forse la variabile mydenari della classe Ladro è condivisa da entrambi i threads. Se è così come si fa a dichiarare una variabile che può essere usata solamente da uno specifico thread?

Vi ringrazio, io navigo in alta marea...

PS: Scusate se il forum non mi permette di indentare il codice

anx721
01-01-2005, 21:27
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:


//- 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.

Loading