salve volevo olevo capire se il project che ho svto è giusto.
Brevemente vi illustro cosa deve fare più thread accedono alla cache a partire daal'indirizzo Ic per cercare dei dati se non li trovano vanno sul disco e una volta trovati li copiano nella cache.
Allego il project grazzie delle risposte.
saluti
package gestionedisco;
import java.util.*;
import java.util.concurrent.locks.*;
/**
*
* @author Danilo Vrenna
*/
class GestioneProc {
private LinkedList<thread> codaAttesa;
private Lock accesso;
private Lock ll,lw;
private ReadWriteLock rwl;
private LinkedList<Integer> cache;
private int Disco[];
private Condition PossoAccInCache;
public GestioneProc(LinkedList<Integer> cache, int Disco[]){
this.cache=cache;
this.Disco=Disco;
rwl = new ReentrantReadWriteLock();
codaAttesa=new LinkedList<thread>();
ll=rwl.readLock();
lw=rwl.writeLock();
}
public boolean RicercaCache(thread t) throws InterruptedException {
boolean trovato;
try{
ll.lock();
trovato=Ricerca(t);
System.out.println(trovato);
if(!trovato) System.out.println("*************************non ho trovato nessun dato nella cahce");
else System.out.println("Ho trovat il dato nella cache "+t.DdC);
System.out.println("--------");
}finally{ll.unlock();}
return trovato;
}
public void RicercaDisco(thread t) {
int Id=-1;
try{
ll.lock();
System.out.println("Dato non trovato in cçççççççç "+t.DdC);
for(int i=0;i<Disco.length;i++) if(Disco[i]==t.DdC) Id=Disco[i];
}finally{ll.unlock();}
System.out.println("!!Aggiorno la cache!!!");
try{lw.lock();
cache.addLast(Id);
}finally{lw.unlock();}
System.out.println("Agg il dato "+cache.getLast().intValue()+"nella cache");
}
private boolean Ricerca(thread t) {
boolean tt=false;
thread proc=t;
ListIterator<Integer> iter=cache.listIterator(proc.Ic);
while(iter.hasNext() && !tt){
Integer x=iter.next();
if(x.intValue()==proc.DdC ){
if(x.intValue()!=-1){
int indice=cache.indexOf(x);
System.out.println("xxxx Processato "+x.intValue()+" indirizzo "+indice);
System.out.println("Dato confrontato "+proc.DdC+" indirizzo "+proc.Ic);
tt=true;
}else tt=false;
}
}
return tt ;
}
}
package gestionedisco;
import java.util.*;
/**
*
* @author Danilo Vrenna
*/
public class Main {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
LinkedList<Integer> cache=new LinkedList<Integer>();
while(cache.size()<10){
int n=(int)(Math.random()*20);
if(cache.contains(n)) n=(int)(Math.random()*40);
cache.addLast(n);
System.out.println("--------");
System.out.println(" posizione "+cache.indexOf(n)+" DATO :: "+cache.getLast().intValue());
}
int dim=cache.size()*2;
int Disco [] =new int[dim];
for(int i=0;i<Disco.length;i++){
Disco[i]=i;
System.out.println("--------");
System.out.println("--------");
System.out.println("valore "+Disco[i]);
System.out.println("--------");
}
GestioneProc gp=new GestioneProc(cache,Disco);
for(int i=0;i<40;i++){
thread t=new thread(i,gp,cache);
t.start();
}
}
}
package gestionedisco;
import java.util.*;
/**
*
* @author Danilo Vrenna
*/
public class thread extends Thread{
public int id, Ic, DdC;
private GestioneProc gp;
LinkedList<Integer> cache;
public thread(int id, GestioneProc gp, LinkedList<Integer> cache){
this.cache=cache;
this.id=id;
this.gp=gp;
Ic=(int)(Math.random()*cache.size());
DdC=(int)(Math.random()*20);
}
public void run(){
try{
while(true){
Thread.sleep(2000);
boolean t=gp.RicercaCache(this);
if(!t){System.out.println("");
Thread.sleep(2000);
gp.RicercaDisco(this);
System.out.println("Utimo dato aggiunto"+cache.getLast().intValue());
}}
}catch(InterruptedException e){System.err.println(e);}
}
}

Rispondi quotando