PDA

View Full Version : [JAVA]Domanda basilare sui Threads


:.Blizzard.:
15-09-2006, 10:41
Ciao a tutti. Stò preparando l'esame di Programmazione ma sono inceppato nello studio dei Threads.
Il concetto di cosa sono ce l'ho ben chiaro ... solo che mi domandavo ...
supponiamo che io voglia creare un programma che dati 2 interi mi calcoli prodotto somma e sottrazione tramite Thread.
Quindi me ne serviranno tre. Uno è il main e ok. Gli altri due li creo implementando l'interfaccia Runnable (chiamiamoli p e s).
Ora ... quando scrivo p.start() questo inizia ad eseguire il codice contenuto all'interno del metodo run(). Come faccio però a gestire il fatto che io voglio che il thread p mi esegua solo il prodotto? In run ovviamente ci sarà una chiamata al metodo "moltiplico", ma devo metterci per forza anche la chiamata al metodo "sommo".
Cioè ... in teoria dovrei avere un metodo run specifico per ogni thread. O no?

Chiedo scusa se sono stato complicato nell'espormi, la domanda è banale ... il succo del discorso è "Come faccio a fare in modo che thread diversi eseguano parti di codice diversi se ho un solo metodo run()?".

Spero di essermi spiegato, in caso contrario vedrò di provvedere.

Grazie in anticipo per eventuali risposte :)

PGI-Bis
15-09-2006, 10:58
In soldoni e come hai già rilevato, ci vuole un run per ogni Thread. Ciò deriva dal fatto che, in Java, l'unità di esecuzione affidabile ad un Thread (detto frame, se non erro) corrisponde ad un intero metodo.

Se hai due enunciati:

x = y + z;
a = b * c;

per renderli eseguibili da due Thread non puoi far altro che affidarli a due metodi:

void somma() {
x = y + z;
}

void moltiplica() {
a = b * c;
}

In questo modo i due enunciati, prima indistinguibili agli occhi di un Thread, risultano incapsulati in due unità distintamente eseguibili. Faccio un esempio in pseudo-codice tanto per essere cristallino

public class RefCaller implements Runnable {
Statement stat;

public RefCaller(Object ref, String method) {
stat = new Statement(ref, method, null);
}

public void run() {
try {
stat.execute();
} catch(Exception ex) {
ex.printStackTrace();
}
}
}

public class StatementHolder {
public void somma() {/*omissis*/}
public void moltiplica() {/*omissis*/}
}

...nel main
StatementHolder sh = new StatementHolder();
new Thread(new RefCaller(sh, "somma")).start();
new Thread(new RefCaller(sh, "moltiplica")).start();

Dunque, come fai ad eseguire parti diverse di codice con Thread diversi? Lo fai inserendo tali parti in metodi distinti e provocando l'invocazione di tali metodi da parte di Thread diversi. Tutto qui.

:.Blizzard.:
15-09-2006, 11:14
purtroppo da neofita del Java mi è risultato un po' complesso capire il codice finale da te postato :(

In ogni caso ... facendo un esercizio prova era proprio quello che avevo fatto ... ovvero avevo creato due metodi a parte :)

Tnx1k4theanswer :D

Se c'è qualcun altro che magari vuole dire la sua è ben accetto! :O :sofico:

MEMon
15-09-2006, 11:22
La risposta è si certo, ogni thread esegue un compito, questo compito è specificato dal metodo run(), quindi i due thread devono essere diversi nel metodo run() per avere compiti diversi.

Ciao PGI-Bis!

TempestaT400
19-09-2006, 03:38
Puoi avere anche più thread che lavorano in maniera concorrente ...
Cioè più thread per un singolo problema in modo tale da scomporre il problema in più sottoproblemi così da risolverlo più velocemente.!.
Ma qui poi entra in gioco la sincronizzazione e non so come stai messo a riguardo!!!