|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jan 2002
Messaggi: 437
|
[JAVA] NON condividere strutture dati tra thread.
Ciao a tutti,
sto scrivendo un piccolo programma che credo beneficerebbe dell'uso dei thread poiché verrà eseguito su un server con 8 core. Devo occuparmi dell'analisi di grande insieme di files, ciascuno da trattare nello stesso modo (leggere il file e salvare su un nuovo file le statistiche ricavate). L'idea quindi era di creare una coda condivisa tra più thread (diciamo 8) dalla quale ciascun thread svolgesse il seguente compito: recupera l'elemento in cima della pila (con rimozione), analizza il file indicato, cicla finché la lista non è vuota. Il risultato è il seguente: Codice:
package runner;
[import ...];
public class Main {
public static void main(String[] args) throws InterruptedException {
int NTHREADS;
if(args[0] != null) NTHREADS = Integer.parseInt(args[0]);
else NTHREADS = 1;
Long t1 = System.currentTimeMillis();
File dir = new File("directory contenente i file da analizzare");
Queue<String> files = new ConcurrentLinkedQueue<String>();
String[] filesArray = dir.list();
for(int i = 0; i < filesArray.length; i++)
files.offer("directory contenente i file da analizzare" + filesArray[i]);
List<PageAnalyzer> threads = new ArrayList<PageAnalyzer>();
for(int i = 0; i < NTHREADS; i++) {
PageAnalyzer p = new PageAnalyzer(files);
threads.add(p);
p.start();
}
for(PageAnalyzer p: threads)
p.join();
Long t2 = System.currentTimeMillis();
System.out.println("Time required: " + (t2 - t1));
}
}
Codice:
package runner;
[import ...];
public class PageAnalyzer extends Thread {
private Queue<String> files;
private Map<Integer, Revision> revisions = new ConcurrentHashMap<Integer, Revision>();
private Map<String, User> authors = new ConcurrentHashMap<String, User>();
public PageAnalyzer(Queue<String> files) {
super();
this.files = files;
new Thread(this).start();
}
public void run() {
String file = "(no file)";
try {
while(!files.isEmpty()) {
file = files.poll();
System.out.println(this.getName() + ": " + file);
analyze(file);
}
} catch (Exception e) {
System.out.println("File: " + file + " caused the following exception");
e.printStackTrace(System.out);
}
}
private void initializeGlobalVariables() {
revisions = new ConcurrentHashMap<Integer, Revision>();
authors = new ConcurrentHashMap<String, User>();
}
public void analyze(String file) {
initializeGlobalVariables();
[...algoritmo noioso...]
}
private void processLine(String line) {
[... funzione usata da analyze per manipolare revisions e authors ...]
}
private static void increment(String username) {
[... funzione usata da analyze per manipolare revisions e authors ...]
}
}
Cosa sto sbagliando? Come faccio ad essere sicuro che revisions e authors vengano usati per l'analisi di un singolo file, senza essere accessibili a qualsiasi altro thread? Come sempre, grazie Ultima modifica di rayman2 : 30-01-2009 alle 10:55. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 19:21.



















