Originariamente inviato da Giandella
Devo realizzare un programma checksum <InputFileName><N> che calcoli la checksum (dimensione totale del valore dei byte contenuti nel file) del file passato in ingresso tramite N thread con cui suddividere il lavoro utilizzando meccanismi di sincrnizzazione in ambiente multithread (come semafori/mutex o metodi synchronized)
In termine "checksum" in generale si usa per definire una qualche forma di controllo di ridondanza per verificare la integrità dei dati. Nel tuo caso, se ho capito bene, è da intendere proprio letteralmente, cioè il controllo più classico (e semplice) ovvero la somma dei byte. Operazione che appunto si presta molto bene ad essere "suddivisa".

Ci sono diverse soluzioni, che innanzitutto si differenziano per quanto riguarda i compiti che i vari thread devono eseguire. Vedo almeno 2 scenari:

1) Un thread si occupa di leggere sequenzialmente il file a blocchi di N byte e ogni blocco lo passa ad un thread a sé stante che si occupa di calcolare il checksum. In questo caso 1 solo thread interagisce con il file mentre gli altri X thread si occupano solo della computazione del checksum.

2) Tutti gli X thread "sanno" del file ed ognuno accede con accesso casuale ad una sezione del file, legge il blocco e computa il checksum. Questo richiede chiaramente l'accesso al file in modo casuale. Non necessariamente 1 thread deve occuparsi di 1 sola sezione, eventualmente può anche essere "istruito" per computare il checksum di più sezioni.

Per la gestione degli X thread la questione è più delicata e complessa. La soluzione migliore e più elegante è l'utilizzo di un thread-pool, a partire da Java 5 è disponibile quello che si chiama "executor framework" che consente di gestire facilmente un thread-pool. Ma bisogna conoscerlo discretamente bene per poterlo usare al meglio.

Agli X thread comunque deve essere passato qualcosa, cioè bisogna in ogni caso istruire il thread per fargli fare qualcosa. Che sia l'array di byte di cui calcolare il checksum o solo la posizione/dimensione della sezione del file da esaminare ma qualcosa va passato (e poi alla fine restituito).

Se non si vuole/può usare l'executor framework, si possono comunque creare "a mano" gli X thread. Si dovrebbe quindi usare una coda, il thread principale inserisce nella coda le informazioni e ogni thread estrae una informazione che usa per computare il checksum.

Ho detto un po' di cose più che altro a livello teorico ... bisogna vedere cosa puoi fare tu e se hai già fatto qualcosa o proprio nulla.