Nell'esempio che hai postato tu dovresti utilizzare il secondo metodo, dato che hai una terza classe che avvia la prima ed il thread. Una cosa: la variabile i è di tipo intero, mentre setText vuole una String... basta il trucchetto della concatenazione
codice:
class Finestra extends Frame{
TextArea output1,output2;
Panel p1,p2;
Finestra(){
setSize(250,120);
setTitle("Corsa dei thread");
setResizable(false);
setLayout(new BorderLayout());
output1 = new TextArea(4,5);
output2 = new TextArea(4,5);
priorita1 = new TextField(1);
priorita2 = new TextField(1);
p1=new Panel();
p2=new Panel();
p1.setLayout(new GridLayout(3,1));
p1.add(output1);
p1.add(priorita1);
add(p1,BorderLayout.WEST);
p2.setLayout(new GridLayout(3,1));
p2.add(output2);
p2.add(priorita2);
add(p2,BorderLayout.EAST);
setVisible(true);
}
// Aggiungo questo metodo che verrà utilizzato dal thread
public void scriviSullaTextArea(int valore) {
output1.setText("" + valore);
}
}
class Thread1 implements Runnable{
Thread t;
Finestra f; // <-- Aggiungo un oggetto Finestra (riferimento)
Thread1(Finestra f){
this.f = f; // <-- creo il riferimento
t= new Thread(this,"THREAD1");
t.start();
}
public void run(){
for (int i=0;i<1000;i++)
f.scriviSullaTextArea(i); // <-- Nota: richiamo il metodo.
}
}
public class esempio{
public static void main(String args[]){
Frame f = new Finestra();
new Thread1( (Finestra) f ); // <-- Gli passo il riferimento
}
}
Forse è meglio se ti spiego anche il perchè di alcune scelte. Cominciamo con la chiamata al costruttore del Thread: ho usato un cast esplicito, perchè tu hai creato un oggetto Finestra dichiarandolo di tipo Frame. Non posso, quindi, passarlo al costruttore così com'è, dato che nel costruttore del thread ho dichiarato, esplicitamente, un oggetto di tipo Finestra. Una alternativa possibile è la seguente:
codice:
public static void main(String args[]) {
Finestra f = new Finestra();
new Thread1(f);
}
Poi ho deciso di passare al metodo scriviSullaTextArea() un tipo int. Così rimani fedelle alla tua convenzione. Una alternativa sarebbe stata quella di passare una stringa, effettuando la concatenazione nel thread:
codice:
...
public void scriviSullaTextArea(String valore) {
output1.setText(valore);
}
...
// Nel Thread:
f.scriviSullaTextArea("" + i);
Ciao.