Prozesse und Threads
Ein Prozess ist der Ausführungsprozess eines Programms (Aufgabe) und ist dynamisch. Er enthält Ressourcen (gemeinsam genutzter Speicher, gemeinsam genutzte Dateien). und Threads ist der Träger von Ressourcen und Threads.
Thread ist die kleinste Ausführungseinheit im System. Es gibt mehrere Threads im selben Prozess und Threads teilen sich die Ressourcen des Prozesses.
Die Thread-Interaktion umfasst gegenseitigen Ausschluss und Synchronisierung.
Gemeinsame Methoden von Threads
Javas Unterstützung für Threads spiegelt sich hauptsächlich in der Klasse Thread und der Schnittstelle Runnable wider, die beide Java erben .lang-Paket. Es gibt eine gemeinsame Methode run()
Thread-Stopp-Fehlermethoden: stop(), interrupt()
Der richtige Weg, einen Thread zu stoppen
public class ArmyRunnable implements Runnable {//volatile保证了线程可以正确读取其他线程写入的值volatile boolean keepRunning = true; @Overridepublic void run() {while(keepRunning) {//发动五连击for (int i = 0; i < 5 ; i++) { System.out.println(Thread.currentThread().getName() + "进攻对方[" + i + "]"); }//暂停 Thread.yield(); } System.out.println(Thread.currentThread().getName() + "结束了战斗"); } }
Rennbedingungen
Wenn mehrere Threads gleichzeitig auf dieselben Daten (Speicherbereich) zugreifen, versucht jeder Thread, die Daten zu verarbeiten, was zu einer Beschädigung der Daten führt. Dieses Phänomen wird als Race Condition bezeichnet.
Thread-Interaktion: gegenseitiger Ausschluss und Synchronisation
Gegenseitiger Ausschluss: Gleichzeitig kann nur ein Thread unsere Schlüsseldaten oder kritischen Abschnitte verarbeiten zu betreiben.
Implementierung des gegenseitigen Ausschlusses: sysnchronized (intrinsische Sperre), sysnchronized entspricht dem Hinzufügen einer Sperre zum Code, damit andere Threads diesen kritischen Bereich nicht betreten können, um auf unsere Schlüsselressourcen zuzugreifen.
Synchronisierung: Da bestimmte Bedingungen eines Threads nicht erfüllt sind, befinden sich andere Threads in einem bestimmten Wartezustand. Da die Bedingungen später erfüllt sind, wird ein Thread verwendet Methode, um andere Threads aufzuwecken.
Implementierung der Synchronisation: wait()/notify()/notifyAll() – Mitgliedsmethode des Objektobjekts
Wartesatz ist der Ruheraum des Threads
public void transfer(int from, int to, double amount) {//通过synchronized 关键字来实现互斥,synchronized既可以出现在方法之上,也能以块的形式出现在方法体之中//通过对lockObj加锁实现互斥//加锁操作是有开销的,多次加锁操作会降低系统的性能synchronized (lockObj) {//while循环,保证条件不满足时任务都会被条件阻挡,而不是继续竞争CPU资源while (energyBoxes[from] < amount) {try {//条件不满足,将当前线程放入锁对象(lockObj)上的wait set//wait set 是线程的休息室 lockObj.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(Thread.currentThread().getName()); energyBoxes[from] -= amount; System.out.printf("从%d转移%10.2f单位能量到%d", from, amount, to); energyBoxes[to] += amount; System.out.printf("能量总和:%10.2f%n",getTotalEnergies()); //唤醒所有在lockObj对象上等待的线程 lockObj.notifyAll(); } }
Der Unterschied zwischen der Runnable-Methode und der Thread-Methode zum Erstellen von Threads
Ausführbare Methode Aufgrund der Einzelvererbungsfunktion von Java können die durch die Thread-Methode verursachten Fehler vermieden werden.
Ausführbarer Code kann von mehreren Threads (Thread-Instanzen) gemeinsam genutzt werden damit mehrere Threads dieselbe Ressource verarbeiten Situation
Thread-Lebenszyklus
Bereit: Nach dem Erstellen des Thread-Objekts wird die start()-Methode des Threads aufgerufen (zu diesem Zeitpunkt tritt der Thread einfach in die Thread-Warteschlange ein, wartet darauf, CPU-Dienste zu erhalten, und hat die Bedingungen für die Ausführung erfüllt sind, die Ausführung jedoch nicht unbedingt gestartet wurde).
Läuft: Sobald der Thread im Bereitschaftszustand die CPU-Ressource erhält, wechselt er in den Ausführungszustand und beginnt mit der Ausführung der Logik in der run()-Methode.
Beendigung: Nachdem die run()-Methode des Threads ausgeführt wurde oder der Thread die stop()-Methode aufruft (diese Methode wurde nicht ausgeführt), wechselt der Thread in den beendeten Zustand.
Blockierung: Unter bestimmten Umständen gibt ein ausführender Thread aus irgendeinem Grund vorübergehend CPU-Ressourcen auf, unterbricht seine eigene Ausführung und wechselt in einen Blockierungszustand, z. B. die Methode „sleep()“
Benutzer-Thread und Daemon-Thread
Benutzer-Thread: Wird im Vordergrund ausgeführt und führt bestimmte Aufgaben aus , wie der Haupt-Thread des Programms und mit dem Netzwerk verbundene Unter-Threads
Daemon-Thread: Läuft im Hintergrund und bedient andere Vordergrund-Threads. Sobald alle Benutzer-Threads abgeschlossen sind Bei diesem Vorgang beendet der Daemon-Thread seine Arbeit zusammen mit der JVM.
Anwendung des Daemon-Threads: Überwachungsthread im Datenbankverbindungspool, Überwachungsthread nach dem Start der virtuellen JVM-Maschine. Der häufigste Daemon-Thread ist der Garbage-Collection-Thread
Daemon-Thread festlegen: Legen Sie den aktuellen Thread als Daemon-Thread fest, indem Sie die Methode setDaemon(true) der Thread-Klasse aufrufen. Hinweis: setDaemon(true) muss vor der start()-Methode aufgerufen werden, andernfalls wird eine Ausnahme ausgelöst. Der im Daemon-Thread generierte neue Thread ist auch ein Daemon-Thread, der ausgeführt werden kann als Lese- und Schreiboperationen.
Erweiterungen
Java-Speichermodus
Sperren & Zustand
Thread Sicherheit: Atomarität und Sichtbarkeit...
Häufig verwendete Interaktionsmodelle in der Multithread-Programmierung
Gleichzeitige Programmiertools in Java5
Referenzbuch
Kern-Java
Java-Parallelität in der Praxis
Das obige ist der detaillierte Inhalt vonJava – detaillierte Beispiele für Prozesse und Threads. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!