Das Konzept von Java Threading <BR /> Im Gegensatz zu den meisten anderen Computersprachen unterstützt Java die Multithread-Programmierung in integriert.
Ein Multi-Thread-Programm enthält zwei oder mehr Teile, die gleichzeitig ausgeführt werden. Jedes solcher Teil des Programms wird als Thread bezeichnet, und jeder Thread hat einen unabhängigen Ausführungspfad. Daher ist Multithreading eine besondere Form des Multitaskings.
Sie müssen Multitasking kennen, da es tatsächlich von allen modernen Betriebssystemen unterstützt wird. Es gibt jedoch zwei verschiedene Arten von Multitasking: prozessbasierte und threadbasierte. Es ist sehr wichtig, die Unterschiede zwischen den beiden zu verstehen.
Für viele Leser ist prozessbasiertes Multitasking eine bekanntere Form. Ein Prozess ist im Wesentlichen ein ausführendes Programm. Daher wird prozessbasiertes Multitasking gekennzeichnet, indem Ihr Computer zwei oder mehr Programme gleichzeitig ausführen kann. Mit prozessbasiertem Multitasking können Sie beispielsweise den Java-Compiler gleichzeitig ausführen, während Sie einen Texteditor verwenden. Bei prozessbasiertem Multitasking ist ein Programm die kleinste Codeeinheit, die vom Scheduler zugewiesen wird.
In einer Thread-basierten Multitasking-Umgebung sind Threads die kleinste Ausführungseinheit. Dies bedeutet, dass ein Programm Funktionen von zwei oder mehr Aufgaben gleichzeitig ausführen kann. Beispielsweise kann ein Texteditor während des Druckens Text formatieren. Daher verarbeiten Multi-Process-Programme "große Bilder", während Multi-Thread-Programme Details verarbeiten.
Multithread-Programme erfordern weniger Verwaltungskosten als Multi-Process-Programme. Prozesse sind Schwergewichtsaufgaben, die einen eigenen unabhängigen Adressraum erfordern. Die Kommunikation zwischen den Prozess ist teuer und eingeschränkt. Die Transformation zwischen den Prozessen ist ebenfalls sehr kostspielig. Themen hingegen sind leichte Spieler. Sie teilen den gleichen Adressraum und teilen den gleichen Prozess gemeinsam. Die Kommunikation zwischen den Threads ist billig und die Umwandlung zwischen den Threads ist ebenfalls kostengünstig. Wenn ein Java-Programm eine Multi-Process-Aufgabenverarbeitungsumgebung verwendet, wird das Multi-Process-Programm nicht von Java gesteuert, während Multi-Threading von Java gesteuert wird.
Mit Multithreading können Sie effiziente Programme mit maximaler CPU -Auslastung schreiben, da die Leerlaufzeit auf ein Minimum gehalten wird. Dies ist für interaktive Netzwerkverbindungsumgebungen, die in Java ausgeführt werden, von entscheidender Bedeutung, da die Freizeit öffentlich ist. Beispielsweise ist die Datenübertragungsrate des Netzwerks viel niedriger als die Verarbeitungskapazität des Computers, und die Lese- und Schreibgeschwindigkeit der lokalen Dateisystemressourcen ist viel niedriger als die der CPU. . In einer traditionellen Umgebung mit einem Thread muss Ihr Programm warten, bis jede solche Aufgabe erledigt wird, bevor die nächste Schritt ausführt-obwohl die CPU viel Freizeit hat. Mit Multithreading können Sie diese Freizeit optimal nutzen.
Java -Threading -Modell
Das Java -Laufzeitsystem stützt sich in vielerlei Hinsicht auf Threads, und alle Klassenbibliotheksdesigns berücksichtigen Multithreading. Tatsächlich verwendet Java Threads, um die gesamte Umgebung asynchron zu gestalten. Dies hilft, den ungültigen Teil zu verringern, indem die Verschwendung von CPU -Schleifen verhindert wird.
Um die Vorteile einer Multithread -Umgebung besser zu verstehen, kann sie mit seinen Kontrollen verglichen werden. Die Verarbeitungsmethode eines einzelnen Thread-Systems besteht darin, eine Ereignisschleifmethode mit dem Namen Polling zu verwenden. In diesem Modell läuft eine Single-Thread-Kontrolle in einer unendlichen Schleife und befragt eine Abfolge von Ereignissen, um zu bestimmen, was als nächstes zu tun ist. Sobald das Wahlbereitungsgerät ein Signal zurückgibt, dass die Netzwerkdatei gelesen werden kann, verwaltet die Event Loop -Planungsteuerung an den entsprechenden Ereignishandler. Bis der Ereignishandler zurückkehrt, treten keine anderen Ereignisse im System auf. Dies verschwendet die CPU -Zeit. Dies führt dazu, dass ein Teil des Programms das System ausschließlich besetzt und die Ausführung anderer Ereignisse verhindern. Im Allgemeinen wird in einer Umgebung, in der ein Thread blockiert (Blöcke, Ausführung), während ein Thread auf Ressourcen blockiert wird, das gesamte Programm nicht mehr ausgeführt.
Der Vorteil von Java Multithreading besteht darin, dass es den Hauptschleif-/Wahlmechanismus absagt. Ein Faden kann durchgeführt werden, ohne andere Teile des Programms zu beeinflussen. Beispielsweise kann die Leerlaufzeit generiert werden, wenn ein Thread Daten aus dem Netzwerk liest oder auf Benutzereingaben wartet, an anderer Stelle verwendet werden. Durch Multithreading kann eine lebende Schleife in jeder Rahmenlücke eine Sekunde lang schlafen, ohne das gesamte System zu pausieren. In einem Java -Programm befindet sich eine Thread -Blockade, nur ein Thread wird suspendiert und die anderen Threads werden weiter ausgeführt.
Themen existieren in mehreren Zuständen. Der Thread kann ausgeführt werden. Es kann so lange laufen, wie Sie eine CPU -Zeit haben. Der laufende Thread kann suspendiert werden und seine Ausführung vorübergehend unterbrechen. Ein suspendiertes Thread kann wieder aufgenommen werden, sodass er weiterhin an der Stelle läuft.
Der Thread kann jederzeit enden, was seinen Betrieb sofort unterbricht. Sobald Sie beendet sind, kann der Thread nicht wiederhergestellt werden.
Priorität der Faden
Java priorisiert jeden Thread, um zu bestimmen, wie der Faden im Vergleich zu anderen Fäden behandelt wird. Die Priorität von Thread ist eine Ganzzahl, die die Prioritätsbeziehung zwischen Threads beschreibt. Als absoluter Wert ist die Priorität bedeutungslos; Stattdessen wird die Thread -Priorität verwendet, um zu bestimmen, wann von einem laufenden Thread zu einem anderen wechselt werden soll. Dies wird als "Kontextschalter" bezeichnet. Die Regeln, die das Auftreten der Kontextkontext -Konvertierung bestimmen, sind einfach:
Themen können die Steuerung automatisch aufgeben. Im Falle von E/A -Unentschieden erfolgt Schlaf oder Blockierung durch explizite Zugeständnisse. Unter dieser Annahme werden alle anderen Threads erkannt und der Faden mit höchster Priorität wird der CPU gewährt.
Fäden können durch Hochprioritätsthreads vorgegeben werden. In diesem Fall gibt der Thread mit niedriger Priorität nicht aktiv auf, der Prozessor ist nur zuerst besetzt - egal was er tut - der Prozessor wird vom Thread mit hoher Priorität besetzt. Sobald ein Thread mit hoher Priorität ausgeführt wird, wird im Grunde genommen ausgeführt. Dies wird als Prioritäts -Multitasking bezeichnet.
Die Situation ist etwas kompliziert, wenn zwei Fäden derselben Priorität um CPU -Zyklen konkurrieren. Für Betriebssysteme wie Windows 98 teilen Threads mit gleicher Priorität die Zeit automatisch im Schleifenmodus. Für andere Betriebssysteme wie Solaris 2.x werden vorrangige Threads im Verhältnis zu ihren Kollegen automatisch aufgegeben. Wenn dies nicht der Fall ist, werden andere Threads nicht ausgeführt.
WARNUNG: Die Kontextumwandlung von Threads mit niedrigerer Priorität auf verschiedenen Betriebssystemen kann Fehler erzeugen.
Synchronisation
Da Multithreading in Ihrem Programm ein asynchrones Verhalten einführt, muss es Möglichkeiten geben, die Synchronisierung zu verbessern, wenn Sie es benötigen. Wenn Sie beispielsweise zwei Threads miteinander kommunizieren und eine komplexe Datenstruktur teilen sollen, z. B. eine Abfolge von verknüpften Listen, müssen Sie eine Möglichkeit haben, sicherzustellen, dass sie nicht miteinander widersprechen. Das heißt, Sie müssen verhindern, dass ein Thread Daten schreibt, während ein anderer Thread Daten aus der verknüpften Liste liest. Zu diesem Zweck implementiert Java eine andere Methode, die auf dem alten Modell der Inter-Process-Synchronisation basiert: Monitor. Der Managementprozess ist ein Kontrollmechanismus, der zuerst von Carhoare definiert ist.
Sie können sich den Managementprozess als eine kleine Box vorstellen, die nur einen Thread steuert. Sobald ein Gewinde in ein Rohr gelangt, müssen alle Gewinde warten, bis das Gewinde das Rohr verlässt. Auf diese Weise kann das Management verwendet werden, um zu verhindern, dass gemeinsame Ressourcen durch mehrere Themen manipuliert werden.
Viele Multi-Thread-Systeme betrachten den Managementprozess als Objekt, auf das sich das Programm eindeutig beziehen und arbeiten muss. Java bietet eine klare Lösung. Es gibt keine "Überwachungsklasse"; Sobald ein Thread in eine Synchronisationsmethode enthalten ist, kann kein anderer Thread die Synchronisationsmethode desselben Objekts aufrufen. Auf diese Weise können Sie einen sehr klaren und prägnanten Multi-Thread-Code schreiben, da die Unterstützung der Synchronisation in die Sprache integriert ist.
Nachrichtenzustellung
Nachdem Sie das Programm in mehrere Threads unterteilt haben, müssen Sie die Verbindung zwischen jedem Thread definieren. Bei der Planung in den meisten anderen Sprachen müssen Sie sich auf das Betriebssystem verlassen, um die Kommunikation zwischen den Threads festzulegen. Dies wird die Kosten sicherlich erhöhen. Java bietet jedoch eine saubere, kostengünstige Möglichkeit, zwischen Multithreads zu sprechen - indem sie vordefinierte Methoden aufrufen, die alle Objekte haben. Mit dem Messaging -System von Java kann ein Thread eine synchrone Methode eines Objekts eingeben und dann dort warten, bis andere Threads ihn explizit benachrichtigen.
Thread -Klasse und Runnable -Schnittstelle
Das Multi-Thread-System von Java basiert auf der Thread-Klasse, ihren Methoden und seiner Co-Company-Schnittstelle. Die Thread -Klasse umfasst die Ausführung von Threads. Da Sie sich nicht direkt auf den Status des laufenden Threads beziehen können, müssen Sie ihn über seinen Proxy verarbeiten, sodass die Thread -Instanz generiert wird. Um einen neuen Thread zu erstellen, muss Ihr Programm den Thread erweitern oder die Runnable -Schnittstelle implementieren.
Die Thread -Klasse definiert verschiedene Methoden, um Threads zu verwalten. Die in diesem Kapitel verwendeten Methoden sind in der Tabelle angezeigt: