Thread e LinkedList

di il
2 risposte

Thread e LinkedList

Buongiorno,
da poco ho cominciato a studiare i Thread, ho provato a passare a un thread un parametro intero e una LinkedList, il thread dovrebbe aggiungere elementi alla lista e restituire la lista. Ma nel main non la stampa correttamente.Questo è il codice, gentilmente potreste dirmi dov'è l'errroe?

class MyThread extends Thread {
private LinkedList<Integer> z;
private int a;
public MyThread (LinkedList<Integer> z,int a)
{
this.z=z;
this.a=a;
}
public void run()
{
for (int i=0;i<a;++i)
{
z.add(i);
}

}
}

class Solution {
public static void main(String[] args) {
LinkedList<Integer> x=new LinkedList<Integer>();
int y=4;

MyThread t1=new MyThread(x,y);
t1.start();

for (int a:x)
{
System.out.println(a);
}

}
}

Grazie

2 Risposte

  • Re: Thread e LinkedList

    AlexNapoli ha scritto:


    da poco ho cominciato a studiare i Thread, ho provato a passare a un thread un parametro intero e una LinkedList, il thread dovrebbe aggiungere elementi alla lista e restituire la lista. Ma nel main non la stampa correttamente.Questo è il codice, gentilmente potreste dirmi dov'è l'errroe?
    Innanzitutto, generalmente è preferibile implementare Runnable invece che estendere Thread, per definire un "lavoro" in un thread. Ma non è quello il problema.
    Il vero problema è che nel main fai lo start del thread ma devi tenere presente che start NON fa eseguire subito il run del thread. Lo start mette solo il thread in stato "runnable", cioè può essere eseguito ma dipende dallo scheduler del thread.
    Per dirlo in altro modo, a seconda delle tempistiche più o meno (s)fortunate, il for finale nel main potrebbe anche essere eseguito e terminare PRIMA che il run() del tuo thread venga eseguito!

    In sostanza, la cosa più semplice che puoi fare nel main è mettere un t1.join() tra lo start e il tuo for finale. Il join() attende che il thread finisca. Quindi dopo il join puoi certamente osservare le modifiche fatte dal thread a quella lista.
  • Re: Thread e LinkedList

    Grazie,grazie adesso funziona!
    ps. per ora seguendo dalle slide del prof. il metodo che utilizza è extends MyThread perciò stavo provando cosi, poi più avanti utilizza Runnable
Devi accedere o registrarti per scrivere nel forum
2 risposte