PDA

View Full Version : java e thread domanda


vittorio130881
14-01-2015, 11:15
ciao a tutti
sto al punto sui thread.
due domande. ad un certo punto dopo aver fatto notare come creare un thread a partire da un implementazione di Runnable fa vedere il metodo alternativo basato su extend di Thread.

in particolare

public class CounterTrhead extends Thread ........ override di run()

e poi istanzio

CounterThread thread=new CounterThread();
thread.start();

ok mi è chiaro perchè Thread implementa a sua volta Runnable.
quello che non ho capito è ciò che dice dopo ovvero preferire l'implementazione di Runnable per 3 motivi di cui due li ho capito uno no:

"solitamente un oggetto della classe Thread non dovrebbe possedere variabili di istanza private che rappresentano i dati da gestire. quindi il metodo run() nella sottoclasse di thread non potrà accedere, in maniera pulita, a tali dati"

cosa significa?


seconda domanda..... i thread in generale condividono i dati (cosi dice la teoria) ma in cosa consiste questa condivisione di dati? ovvero che se dichiaro e creo un thread dal thread principale, il thread figlio potrà leggere e usare le variabili del thread principale?? mi fate se possibile un esempio?

sottovento
15-01-2015, 05:31
"solitamente un oggetto della classe Thread non dovrebbe possedere variabili di istanza private che rappresentano i dati da gestire. quindi il metodo run() nella sottoclasse di thread non potrà accedere, in maniera pulita, a tali dati"

cosa significa?

Gia', cosa significa? Potresti chiedere all'autore. Secondo me e' il segno che non ha riletto quello che ha scritto.
Se lo contatti, facci sapere.


seconda domanda..... i thread in generale condividono i dati (cosi dice la teoria) ma in cosa consiste questa condivisione di dati? ovvero che se dichiaro e creo un thread dal thread principale, il thread figlio potrà leggere e usare le variabili del thread principale?? mi fate se possibile un esempio?
Si, e' corretto. In realta' si parla di variabili membro delle varie classi. Supponi che da una classe che implementa Runnable si instanzi uno o piu' thread. Tutti questi thread potranno accedere alle variabili membro, ovviamente con tutti i problemi annessi e connessi.

Esempio - questo codice crea 10 thread che accedono tutti alla stessa variabile counter, incrementandone il valore e stampandola.
E' un tipico caso di accesso ad una risorsa condivisa (la variabile counter, appunto). L'accesso alle risorse condivise normalmente viene regolato, come nel caso in cui piu' persone (thread) vogliano usare il bagno (risorsa). E' opportuno che ci si metta d'accordo e che lo si usi uno alla volta, giusto? Nel frattempo, le altre persone possono fare altro.
In questo esempio, non c'e' nulla che regoli l'accesso alla variabile counter, perche' hai chiesto un esempio in cui piu' thread condividono le stesse variabili. Ma immagino che il risultato non sia quello che ti aspetti...

class Test implements Runnable
{
private int counter = 0;

@Override
public void run()
{
try
{
for (int i = 0; i < 5; i++)
{
counter++;
System.out.println(Integer.toString(counter));
Thread.sleep(500);
}
}
catch (InterruptedException e)
{
System.out.println("Thread interrupted");
}
}

public static void main(String[] args)
{
Runnable r = new Test();
for (int i = 0; i < 10; i++)
{
new Thread(r).start();
}
}
}

vittorio130881
15-01-2015, 10:02
ok grazie mi è chiara la tua spiegazione sul secondo punto.
contatto spesso l'autore lo ammetto :)
ma faccio finta di aver capito quello che ha scritto sulla prima :)
fa nulla grazie!