anche qui problema risolto
se può interessare inserisco le soluzioni, il programma consiste di 4 classi ed un'interfaccia.
codice:
import java.io.*;
import java.util.concurrent.*;
/**Classe contenente il main, quindi punto di accesso del programma.
* Lo scopo della classe è quello di realizzare il conteggio del valore dei
* byte contenuto in un file utilizzando metodi multithreaded.**/
public class Checksum {
public static void main(String[] args) {
//verifica numero parametri passati.
if(args.length!=2){
System.out.println("numero parametri errato;si prega di inserirne 2.");
System.exit(1);
}
//acquisizione nome file e numero thread.
String nomefile=args[0]; //nome del file.
int nthread= Integer.parseInt(args[1]); //numero di thread.
int nbyte=0;
//verifica esistenza file.
int i;
FileInputStream fis = null;
File file=new File(nomefile);
if (!file.exists()){
System.out.println("file richiesto non presente.");
System.exit(1);
}
//verifica numero thread.
if(nthread<1){
System.out.println("numero thread errato;si prega di inserirne un numero >0.");
System.exit(1);
}
try {
fis=new FileInputStream(file); //lettura file.
nbyte=fis.available(); //lettura numero byte.
} catch (Exception e) {
e.printStackTrace(); //gestione possibile errore.
}
IBufferSum buf=new BufferSum(nthread);
int ncount=nbyte/nthread; //numero byte da contare per thread.
int resto=nbyte%nthread;
byte[] buffer;
//Creazione array di semafori per gestire il sincronismo tra padre e thread figli.
Semaphore semafori[]=new Semaphore[nthread];
for(i=0;i<nthread;i++){
semafori[i]= new Semaphore(0);
}
/**Ciclo for per associare l'analisi del file ai vari thread dividendo in parti
* uguali il lavoro ad ognuno.**/
for(i=0;i<nthread;i++){
if(i<nthread-1){
buffer=new byte[ncount];
try {
fis.read(buffer,0,ncount);
} catch (IOException e) {
e.printStackTrace();
}
SumProducer sumprod=new SumProducer(buf,buffer,semafori[i]);
sumprod.start();
}else{
buffer=new byte[ncount+resto];
try {
fis.read(buffer,0,ncount+resto);
} catch (IOException e) {
e.printStackTrace();
}
SumProducer sumprod=new SumProducer(buf,buffer,semafori[i]);
sumprod.start();
}
}
/**Ciclo for con cui il main controlla lo stato dei semafori in attesa che
siano tuti "verdi" in modo da avere il via libera per effettuare la somma totale.**/
for(i=0;i<nthread;i++){
try {
semafori[i].acquire();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
/**Creazione di un oggetto SumConsumer per la somma e la stampa del risultato.**/
SumConsumer sumtot=new SumConsumer(buf);
sumtot.start();
}
}
codice:
import java.util.concurrent.Semaphore;
/**Interfaccia che raccoglie i metodi della classe BufferSum.**/
public interface IBufferSum {
void insertsum(int somma,Semaphore s) throws IndexOutOfBoundsException;
int keepsum(int k) throws IndexOutOfBoundsException;
int size();
}
codice:
import java.util.concurrent.Semaphore;
/**Classe che implementa l'interfaccia IBufferSum e i rispettivi metodi.
* Ha tre campi privati;un array per contenere le somme parziali del alore dei byte,
* un intero i e un intero per la dimensione dell'array.**/
public class BufferSum implements IBufferSum{
private int[] buffer;
private int i;
private int size;
/**Costruttore della classe che ri+ceve un intero come parametro passato
* e va a settare gli altri campi.*/
public BufferSum(int size){
this.size=size;
buffer=new int[size];
i=0;
}
/**Metodo di inserimento dei valori nell'array. E' synchronized per permetere
* l'inserimento da parte dei thread del valore calcolato in una cella dell'array
* evitando la scrittura da parte di due o più thread in concomitanza su di una
* singola cella.**/
public synchronized void insertsum(int somma, Semaphore s) throws IndexOutOfBoundsException{
buffer[i] = somma;
i++;
s.release(); //setta il semaforo a "verde".
}
/**Metodo per prelevare il valore da una cella dell'array.**/
public int keepsum(int k) throws IndexOutOfBoundsException{
return buffer[k];
}
/**Restituisce la dimensione dell'array.**/
public int size(){
return size;
}
}
codice:
/**Classe che realizza la somma degli elementi contenuti nell'array
che memorizza la somma parziale. Stampa a video del risultato.**/
public class SumConsumer extends Thread{
private IBufferSum buf;
//Costruttore della classe.
public SumConsumer(IBufferSum buf){
this.buf=buf;
}
//riscrittura del metodo run per calcolo somma totale.
public void run(){
int somma=0;
for(int i=0;i<buf.size();i++){
somma=somma+buf.keepsum(i);
}
//Stampa della somma a video.
System.out.println("La somma è: "+somma);
}
}
codice:
import java.util.concurrent.Semaphore;
/**Classe che estende la classe Thread realizzata per effettuare il calcolo
* della somma del valore dei byte di parte del file passato in ingresso.
* Costituita da tre campi privati;uno per memorizzare l'array di byte
* da analizzare, uno per memorizzare il semoforo attibuito al thread e
* uno relativo ad un oggetto IBuffer.**/
public class SumProducer extends Thread{
private byte[] buffer;
private Semaphore s;
private IBufferSum buf;
//Costruttore della classe.
public SumProducer(IBufferSum buf,byte[] buffer,Semaphore s){
this.buf=buf;
this.s=s;
this.buffer=buffer;
}
/**Riscrittura del metodo run che realizza la funzione di somma parziale.**/
public void run(){
int sum=0;
int ncount=buffer.length;
for(int i=0;i<ncount;i++){
sum=sum+buffer[i];
}
buf.insertsum(sum,s);
}
}