Guest User

Untitled

a guest
Jun 9th, 2015
215
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.11 KB | None | 0 0
  1. /* In Java, con i Monitor
  2.  
  3. Realizzare una pipeline (catena di montaggio) di N thread/processi.
  4. Passare ai thread/processi una funzione f(i) (immagino
  5. la funzione x=x+1) da applicare ai dati secondo lo schema:
  6.  
  7.  
  8. Se f(i) è la funzione passata di thread T(i) il risultato sarà: */
  9.  
  10.  
  11.  
  12. public class CreaNThread extends Thread {
  13.     static final int NTHREAD=10;            // numero di thread da creare
  14.     final int index;                // indice del thread appena creato
  15.  
  16.     // costruttore: memorizza l'indice del thread
  17.     CreaNThread(int i) {
  18.         index = i;
  19.     }
  20.  
  21.     //codice da eseguire allo start del thread
  22.     public void run(){
  23.         Pipeline.threadBody(index);
  24.     }
  25.    
  26.    
  27.  
  28.  
  29.  
  30.     //il main crea i thread, attende la terminazione e stampa il valore finale
  31.     public static void main(String args[]) throws InterruptedException {
  32.         int i;
  33.         Thread t[] = new Thread[NTHREAD];
  34.  
  35.         // crea 10 thread e li esegue
  36.         for(i=0;i<NTHREAD;i++) {
  37.             t[i] = new CreaNThread(i);
  38.             t[i].start();
  39.         }
  40.  
  41.         Pipeline x = new Pipeline; //creo un monitor
  42.  
  43.  
  44.  
  45.  
  46.  
  47.         // stampa il valore finale della funzione, il valore atteso ed esce
  48.         System.out.println("Il valore finale della funzione " + i.valore() );
  49.  
  50.  
  51.  
  52.  
  53.  
  54.  
  55. class Pipeline {
  56.     private int count=0;    // privato: no accessi diretti!
  57.     int turno =0;
  58.     int input=0;        //sarà il valore di input della funzione successiva, e
  59.                 //corrispondente al valore di output della funzione attuale
  60.  
  61.  
  62.     // il metodo synchronized garantisce mutua esclusione sullo stesso oggetto
  63.     synchronized static void function() {
  64.        
  65.         count+=1; //la mia funzione restituirà dunque il successivo
  66.     }
  67.  
  68.  
  69.     syncronized void threadBody(int i){
  70.         while(turno!=i)wait(); //se il turno non è quello del thread allora il thread aspetta
  71.  
  72.         //esecuzione
  73.         System.out.println("Thread "+i+" eseguito!");
  74.        
  75.         //cambio valore dell'input per il prossimo thread
  76.         input= function();
  77.        
  78.         //turno successivo. Notifico a tutti  che ho finito il mio conto.
  79.         //essendo dentro ad un while allora di ripartirà e nuovamente entrerà in ciclo solamente 
  80.         //il thread con il permesso
  81.         notifyAll();
  82.     }
  83.  
  84.     int valore() {
  85.         return(count);
  86.     }
  87. }
Advertisement
Add Comment
Please, Sign In to add comment