Verständnisfrage zu Threads: Reihenfolge und BufferedOutputStream

  • Angenommen, folgender Code:

    Was würde nun passieren, wenn ich diese Methode vom GUI-thread aus mehrmals ausführe, mit verschiedenen Parametern? Würde der zweite Thread erst nach dem Ende des ersten beginnen zu laufen, oder laufen beide gleichzeitig?


    Um das zu testen, habe ich eine App geschrieben, die bei Button-Klick diese Methode gleich zwei mal ausführt, allerdings mit zwei unterschiedlichen File-Pfad-Parametern. Die erste Datei ist eine Textdatei voller "AAAAAAA...", die zweite voller "BBBBBBBB...".


    Betätigt man diesen Button, kommen auf dem Server zuerst nur die AAAAA-Dateien an. Erst wenn das letzte A angekommen ist, kommen die ganzen Bs.


    Daraus KÖNNTE man schließen, dass die Threads sequentiell und nicht simultan ausgeführt werden.


    Allerdings bin ich dem nicht so ganz sicher. Es könnte ja auch sein, dass der Buffer vom BufferedOutputStreams (oder vom Socket-Output-Stream??!) dafür sorgt, dass nicht mehrere threads ihn gleichzeitig füllen können, d.h., Datei "B" kommt erst rein, wenn der Datei "A" fertig eingelesen wird.
    Falls ich damit recht haben sollte.... was passiert mit einem Thread (hier Thread2 mit B-Datei), wenn sein Einschreibungsvorgang in den Buffer (oder Socketstream oder was auch immer) aus den o.g. Gründen blockiert wird? Wird der ganze Thread blockiert, oder läuft er weiter? Beim letzteren könnte man sich die "Streamabteilung" ja wie ein eigener Thread vorstellen.


    Würde mich hier über etwas Aufklärung von einem Experten sehr freuen.


    Vielen Dank

  • bitte formatier deinen quellcode richtig. hier im forum hast du die möglichkeit den quellcode in unserem texteditor in einen code container zu packen, der dir dann im Beitrag den quellcode schön darstellt.


    Prinzipiell ist aber zu sagen, man kann vorher nie sagen wann welcher thread fertig ist. Wann welcher Thread fertig ist ist von sehr vielen Faktoren abhängig. Mehr kann ich dir aber sagen wenn der code lesbar ist.

  • ja, man könnte den spaß noch einrücken und im editor das syntaxhighlighting für java aktivieren aber man kann es schonmal besser lesen :P


    Dennoch ändert das nix an meiner aussage, man kann nicht voraussagen wann welcher thread fertig ist. In deinem Beispiel werden außerdem noch daten asynchron geschrieben. Da musst du synchronisieren um keine ungewollten nebeneffekte zu erzeugen.

  • Wie bereits ChampS gesagt hat du müsstest das ganze thread-safe machen.
    Das erreichst unter anderem, wenn du deine Operationen in eine Methode auslagerst

    Java
    private synchronized void sendFile(String path){
        // do your stuff 
    }

    Ich würde allerdings empfehlen das ganze in einem Object von AsyncTask Typ umzusetzen.


    Du könntest mal deine Code Loggen welcher Thread sich grade wo befindet.

    Java
    Thread.currentThread().getId();
    Thread.currentThread().getName();


    Ob die Threads nacheinander laufen oder "simultan" hängt von der Implementierung ab.
    In deinem Fall ist das schwer zusagen, da ich nicht weiß was hinter AsynchUtil steht.
    Und die Socket Eigenschaften wären auch noch interessant zu wissen.


    Willst du mehrerer Asynchrone Threads "simultan" laufen lassen solltest du einen Blick auf den ThreadPoolExecutor werfen.
    https://developer.android.com/…t/ThreadPoolExecutor.html

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!