Sto provando a vedere la reattività della GUI quando un compito pesante finisce nel event dispatcher (thread che si occupa di eseguire i compiti dei listener e cambiamenti sull'interfaccia) oppure in un thread apparte.
Il risultato è sorprendente però non riesco a capire una cosa.
Ecco il codice da me creato(sono le due classi interne che implementano i listener per i miei 2 bottoni dell'applicazione):
public class button1Listener implements ActionListener{
public void calcolone(){
Runnable r = new Runnable(){
public void run(){
int i=0;
while(true){
i++;
i--;
}
}
};
Thread t = new Thread(r);
t.start();
}
public void actionPerformed(ActionEvent e){
calcolone();
}
}
public class button2Listener implements ActionListener{
public void actionPerformed(ActionEvent e){
int i=0;
while(true){
i++;
i--;
}
}
}
nel primo listener ho creato un metodo calcolone con un ciclo infinito. Ho istanziato un oggetto di tipo runnable implementando l'interfaccia runnable e il suo metodo run che contiene il ciclo. Dopo ho creato un thread a cui passo l'oggetto runnable che contiene run implementato. Actionperformed richiama il metodo calcolone.
Il secondo invece è un semplice listener dove actionperformed esegue il ciclo.
Ora, provando il programma, con il primo pulsante l'interfaccia rimane attiva cioè non si blocca mentre se premo il secondo pulsante si blocca.
Ora vorrei capire...
Ma io nel primo listener nell'actionperformed chiamo calcolone() che a sua volta crea un thread? E dato che actionperformed va nell'event dispatcher non ci va anche il thread che creo in calcolone()?
Perchè non si ha lo stesso effetto del secondo listener?
cioè vorrei capire perchè il thread di calcolone() non va nell'evet dispatcher dato che actionperformed richiama calcolone()...
Grazie a tutti!