Angenommen, folgender Code:
public void SendFileThread(final int threadID, final String path){
AsynchUtil.runAsynchronously(new Runnable() {@Override
public void run() {
final File file = new File(path);
byte[] bytes = new byte[(int) file.length()];
try {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
bis.read(bytes, 0, bytes.length);
bos.write(bytes, 0, bytes.length);
bos.flush();
ThreadFinish(threadID);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
}
}
});
}
Alles anzeigen
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