2009-07-15 4 views
1

Wenn ich read() auf einem DataInputStream aufruft, dauert es CPU-Zyklen, die auf Daten warten, oder liefert es den aktuellen Thread und wird durch einen Interrupt geweckt, der signalisiert, dass Daten angekommen sind?java: datainputstream: Nehmen Leseaufrufe Prozessorzeit in Anspruch, während sie auf Daten warten?

Meine Motivation ist festzustellen, ob ein Stream-Reader in einem eigenen Thread sein muss oder nicht. Ein blockierender Lesevorgang, der CPU-Zeit beansprucht, wäre nicht ideal, da dies den Hauptthread aufhängen würde.

Verwandte Frage: Wenn eine Methode als eine Blockierung beschrieben wird, IMPULSIERT, dass der Thread während des Wartens nachgibt? Oder gibt es keinen Vertrag/Garantie? Eine Methode, die ständig nach Daten sucht/abfragt blockiert immer noch, so klingt es für mich.

Antwort

1

Es dauert nicht CPU-Zyklen, aber blockiert, wird auch nichts anderes ausgeführt.

Wenn Sie können, verwenden Sie Java NIO, die nicht blockiert ist. Andernfalls könnte ein separater Thread ideal sein.

3

Im Allgemeinen wird I/O den Lese-Thread blockieren, bis Daten verfügbar sind, und andere Threads können ausgeführt werden. Wenn Daten eintreffen, wird der Leser entsperrt.

Blockieren impliziert, dass der blockierte Thread darauf wartet, entsperrt zu werden, während andere Threads ausgeführt werden. Sie nicht im Allgemeinen finden (in gut gestalteten Code - und nicht in der Java-Laufzeit) busy-waiting-Code, der beim Abfragen von Daten Schleifen.

Auf der anderen Seite, ich habe so ziemlich alles in Code zu sehen, die ich :-(

übernehmen haben mussten
1

Es gibt eine bestimmte Menge an Zyklen, die durch die Blockierung aufgenommen werden. Es besteht die ist thread switch.Associated Probleme mit Caches voll von nicht hilfreiche Daten.Was ist, auf Multithread-Maschinen, gibt es eine kurze Zeit des Drehens für den Fall, dass der Thread ohne den Kontext wechseln schnell freigegeben werden kann.

Also, es gibt ein winziges Stück Overhead. Sobald dies jedoch aus dem Weg ist, sollte es kein Problem sein. Die Tatsache, dass Sie DataInputStream verwenden, ist weder hier noch dort. Wenn Sie bestimmte Leistungsprobleme sehen, Adresse jene. Die E/A-Leistung ist für E/A-Vorgänge wahrscheinlich wichtiger als die CPU-Leistung.

0

Es ist gut aus Threading-Sicht (wie in den anderen Antworten) - keine/minimale CPU-Nutzung beim Blockieren.

Erwarten Sie jedoch keine hohe E/A-Leistung - da die InputStream-Lesemethoden synchronisiert, blockiert und Sicherheitsüberprüfungen für JEDES Byte durchführen, sind sie ziemlich langsam. Wenn Sie Bulk-Daten lesen, schauen Sie in NIO oder lesen Sie ein großes Byte [] gleichzeitig. 1K-8K ist mehr oder weniger Standard.