View Full Version : [Java] problemi con i thread
Oceans11
05-03-2007, 09:58
1) Stoppare i thread
Ho già dato un'occhiata qui (http://hwupgrade.it/forum/showthread.php?t=1219909), ma non mi è mica tanto chiaro...:rolleyes:
esistono un'infinità di programmi che permettono la "pausa" durante una computazione molto lunga o su una funzione "bloccante"...
se mi trovo in uno di questi casi come faccio a sospendere le operazioni dei thread??
premetto che ho un thread "principale" che gestisce la partenza di altri thread "figli".
2) Ho un metodo per scrivere su file...se 2 thread devono utilizzare quel metodo per uno stesso file come evito problemi???basta dichiarare il metodo synchronized o no?
1) Stoppare i thread
Ho già dato un'occhiata qui (http://hwupgrade.it/forum/showthread.php?t=1219909), ma non mi è mica tanto chiaro...:rolleyes:
esistono un'infinità di programmi che permettono la "pausa" durante una computazione molto lunga o su una funzione "bloccante"...
se mi trovo in uno di questi casi come faccio a sospendere le operazioni dei thread??Leggi <questo> (http://java.sun.com/javase/6/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html) documento.
2) Ho un metodo per scrivere su file...se 2 thread devono utilizzare quel metodo per uno stesso file come evito problemi???basta dichiarare il metodo synchronized o no?Dipende da cosa hai fatto realmente a livello di codice. Cosa prende come parametri questo metodo, e cosa fa sul file? Cioè quali classi e oggetti usi?
Oceans11
05-03-2007, 13:31
1) grazie per la dritta...ho dato una letta, appena posso vedo di applicare, se qualcosa non mi torna torno a chiedere consiglio! :D
2) il metodo è questo:
public ?synchronized? void scriviSuFile(File f, String line) throws IOException {
boolean append = true;
PrintWriter pw = new PrintWriter(new FileWriter(f, append));
pw.println(line);
pw.close();
}
2) il metodo è questo:
public ?synchronized? void scriviSuFile(File f, String line) throws IOException {
boolean append = true;
PrintWriter pw = new PrintWriter(new FileWriter(f, append));
pw.println(line);
pw.close();
}Facciamo una premessa (che forse sai già): synchronized serve per far sì che 1 solo thread possa ottenere il lock su un determinato oggetto. Mettendo synchronized ad un metodo di istanza, il lock è fatto sulla istanza della classe che contiene il metodo.
Supponiamo che il tuo metodo sia nella classe ScritturaFile (tanto per dare un nome) e che tu abbia messo il synchronized al metodo. Se 2 o più thread invocano scriviSuFile() sulla stessa istanza di ScritturaFile, allora sei certo che solamente 1 thread per volta eseguirà il metodo.
Nulla però vieterebbe di avere più istanze della tua classe e invocare il metodo da più thread ma sulle diverse istanze. In questo caso non ci sarebbe alcuna sincronizzazione!!
Insomma, se la tua necessità è quella di far sì che l'accesso al file sia esclusivo, allora è un problema di lock del file e non di sincronizzazione a livello di metodi.
Oceans11
05-03-2007, 17:05
Supponiamo che il tuo metodo sia nella classe ScritturaFile (tanto per dare un nome) e che tu abbia messo il synchronized al metodo. Se 2 o più thread invocano scriviSuFile() sulla stessa istanza di ScritturaFile, allora sei certo che solamente 1 thread per volta eseguirà il metodo.
Nulla però vieterebbe di avere più istanze della tua classe e invocare il metodo da più thread ma sulle diverse istanze. In questo caso non ci sarebbe alcuna sincronizzazione!!
Insomma, se la tua necessità è quella di far sì che l'accesso al file sia esclusivo, allora è un problema di lock del file e non di sincronizzazione a livello di metodi.
Ok penso di aver capito. In effetti il metodo in questione appartiene alla classe Thread che ho esteso, chiamiamola MyThread; però uso diverse istanze di quella classe ed ognuna ha il suo metodo scriviSuFile. Allora è inutile usare sync perchè ognuna invocherebbe il metodo senza sincronizzazione.
Ora però mi chiedo, e se il metodo fosse di classe e non di istanza?
Ora però mi chiedo, e se il metodo fosse di classe e non di istanza?Se il metodo è "di classe" ed ha il synchronized, allora il lock è sull'oggetto Class associato alla classe.
Oceans11
05-03-2007, 17:13
Se il metodo è "di classe" ed ha il synchronized, allora il lock è sull'oggetto Class associato alla classe.
E sto oggetto Class sarebbe??:rolleyes:
E sto oggetto Class sarebbe??:rolleyes:java.lang.Class .... la classe che rappresenta .. una classe.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.