Visualizzazione dei risultati da 1 a 2 su 2

Discussione: [JAVA] Threads

  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2004
    Messaggi
    59

    [JAVA] Threads

    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

  2. #2
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    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.

    Sun Certified Java Programmer

    EUCIP Core Level Certified

    European Certification of Informatics Professionals

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.