Frage zu meinem Programm, ArrayList<String> leeren

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Frage zu meinem Programm, ArrayList<String> leeren

    Hi leute,ich versuche mit thread eina ArrayList<String> zu leeren.
    AlienMother soll zeigen was vorhanden ist und AlienKiller soll leeren
    Ich weiss aber nicht ob das wirklich der fall ist.

    Java-Quellcode

    1. import java.util.*;
    2. public class Aliens
    3. {
    4. Random r=new Random();
    5. ArrayList<String> list =new ArrayList<String>();
    6. public Aliens()
    7. {
    8. list.add("Alien:0");
    9. list.add("Alien:1");
    10. list.add("Alien:2");
    11. list.add("Alien:3");
    12. list.add("Alien:4");
    13. list.add("Alien:5");
    14. list.add("Alien:6");
    15. list.add("Alien:7");
    16. list.add("Alien:8");
    17. list.add("Alien:9");
    18. }
    19. public ArrayList<String> getAliens()
    20. {
    21. return list;
    22. }
    23. public void removeAliens()
    24. {
    25. list.remove(0);
    26. }
    27. }
    Alles anzeigen



    public class AliensMother extends Thread
    {

    private Aliens aliens;

    public AliensMother (Aliens ali)
    {
    aliens=ali;
    }
    public void run()
    {
    for ( int i = 0; i < 10; i++ ) {
    aliens.getAliens();
    System.out.println("Alien Mother put "+i+ " Aliens ");




    try {
    sleep( 100 );
    } catch ( InterruptedException e ) { }

    }
    }
    }



    public class AlienKiller extends Thread
    {
    Aliens aliens;

    public AlienKiller (Aliens a)
    {
    aliens=a;
    }
    public void run()
    {
    for(int i=0; i<=10; i++)
    {
    aliens.removeAliens();
    System.out.println("AlienKiller kills"+ i + " Aliens ");



    try {
    sleep( 100 );
    } catch ( InterruptedException e ) { }
    }
    }
    }



    public class Test {

    public static void main( String[] args ) {
    Aliens h = new Aliens();
    AliensMother a1 = new AliensMother(h);
    AlienKiller a2=new AlienKiller(h);

    a1.start();
    a2.start();

    }
    }



    Synchornized und ect hab ich mal weg gelassen
  • prinzipiell funktioniert das schon. Du versuchst nur 11 Aliens zu löschen aber vorhanden sind nur 10, daher kommts zu ner "IndexOutOfBoundsException".
    das liegt an deiner for-schleife in AlienKiller

    Quellcode

    1. for(int i=0; i<=10; i++)

    da müsste wohl ein i < 10 rein, statt <=

    Nur ist mir nicht ganz klar, was AlienMother machen soll. Im Moment macht es nämlichrelativ wenig. Du holst dir zwar mit

    Quellcode

    1. aliens.getAliens();
    die Liste der Aliens, diese wird aber in keinster Weise verarbeitet.
    Und außerdem hab ich das Gefühl, dass du versuchst die beiden Schleifen in den jeweiligen Threads exakt parallel laufen zu lassen, was nicht funktionieren wird. D.h. es kann durchaus passieren, dass der eine Thread erst bei 8 Schleifendurchläufen ist, während der andere schon fertig ist. Wie genau das Timing ausgeht hängt von einigen Faktoren ab und man kann sich deshalb nicht drauf verlassen. Das sieht man ganz schön, wenn man das Programm einfach mehrmals laufen lässt. Die Reihenfolge der Meldungen ist meistens unterschiedlich.
  • Hallo Ronder,danke fuer deine Antwort.

    Die Methode

    Quellcode

    1. aliens.getAliens();
    zeigt einfach nur im terminal an , dass fuer jedes i im ArryaList ein Alien ist. Ich wollte, dass schon mit einem Thread machen zur Uebung.
    Danke auch fuer den Tipp mit der for Schleife.

    Allerdings habe ich noch eine Frage : Ich moechte gerne, wenn meine Test Class laeuft, dass ein txt file ensteht mit der selben Ausgabe.

    Quellcode

    1. import java.util.*;
    2. import java.io.*;
    3. public class Writer
    4. {
    5. Aliens aliens;
    6. public Writer()
    7. {
    8. try{
    9. BufferedWriter writer=new BufferedWriter(new FileWriter("test.txt"));
    10. writer.write("");
    11. writer.close();
    12. }
    13. catch(Exception e){}
    14. System.out.println("");
    15. }
    16. }
    Alles anzeigen


    Ich will den Writer schon in einer seperaten Class haben nur leider weiss ich nicht , wie ich das richtig verbinden soll.

    greets @ all
  • Du hast doch eh nur die beiden Ausgaben in AlienMother und AlienKiller, wäre es da nicht einfacher dierekt nach der Ausgabe den Schreibvorgang in die Datei zu setzen?
    Oder hab ich hier etwas grundsätzlich falsch verstanden?
    Sorry, ich hab mich mit Threads noch nicht all zu sehr beschäftigt, mag durchaus sein, das ich da etwas übersehe. Aber ich würde die Ausgabe in die Datei jehweils dierekt nach der Ausgabe auf dem Bildschirm geschehen lassen.