


So lösen Sie Probleme bei der Kommunikation zwischen Threads und beim Datenaustausch in Java
So lösen Sie das Problem der Inter-Thread-Kommunikation und des Datenaustauschs in Java
In Java sind Inter-Thread-Kommunikation und Datenaustausch wichtige Komponenten, um eine Multithread-Programmierung zu erreichen. Damit mehrere Threads sicher auf gemeinsam genutzte Daten zugreifen und effektiv kommunizieren können, müssen wir einen Mechanismus verwenden, um die Reihenfolge und Datenkonsistenz zwischen Threads sicherzustellen. In diesem Artikel werden mehrere gängige Lösungen für die Kommunikation zwischen Threads und den Datenaustausch in Java vorgestellt und entsprechende Codebeispiele bereitgestellt.
1. Verwenden Sie das synchronisierte Schlüsselwort, um die Kommunikation zwischen Threads und den Datenaustausch zu implementieren.
- Verwenden Sie die synchronisierte Methode.
Das synchronisierte Schlüsselwort kann die Methode so ändern, dass nur ein Thread die Methode zur Ausführung eingeben kann und andere Threads dies benötigen warten. Dies kann verwendet werden, um die Kommunikation und den Datenaustausch zwischen Threads zu implementieren.
Beispielcode:
public class ThreadCommunication { private boolean flag = false; public synchronized void printNumbers() { // 线程A负责打印奇数 for (int i = 1; i <= 10; i += 2) { while (flag) { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("ThreadA: " + i); flag = true; notifyAll(); } } public synchronized void printLetters() { // 线程B负责打印偶数 for (char c = 'A'; c <= 'J'; c += 2) { while (!flag) { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("ThreadB: " + c); flag = false; notifyAll(); } } public static void main(String[] args) { final ThreadCommunication communication = new ThreadCommunication(); Thread threadA = new Thread(new Runnable() { @Override public void run() { communication.printNumbers(); } }); Thread threadB = new Thread(new Runnable() { @Override public void run() { communication.printLetters(); } }); threadA.start(); threadB.start(); } }
Im obigen Beispiel wird durch Ändern der Methoden printNumbers() und printLetters() mit dem synchronisierten Schlüsselwort die Konsistenz der Reihenfolge und der gemeinsam genutzten Daten zwischen Thread A und Thread B sichergestellt. Verwenden Sie das Flag-Flag, um die abwechselnde Ausführung zweier Threads zu steuern, und verwenden Sie die Methoden wait () und notifyAll (), um den gegenseitigen Ausschluss und die Kommunikation von Threads durchzuführen.
- Synchronisierte Blöcke verwenden
Das synchronisierte Schlüsselwort kann den Codeblock auch so ändern, dass nur ein Thread den Codeblock zur Ausführung betreten kann und andere Threads warten müssen. Dies kann verwendet werden, um die Kommunikation und den Datenaustausch zwischen Threads zu implementieren.
Beispielcode:
public class ThreadCommunication2 { private Object lock = new Object(); private int number = 0; public void printNumbers() { synchronized (lock) { // 线程A负责打印奇数 for (int i = 1; i <= 10; i += 2) { while (number % 2 == 0) { try { lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("ThreadA: " + i); number++; lock.notifyAll(); } } } public void printLetters() { synchronized (lock) { // 线程B负责打印偶数 for (char c = 'A'; c <= 'J'; c += 2) { while (number % 2 != 0) { try { lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("ThreadB: " + c); number++; lock.notifyAll(); } } } public static void main(String[] args) { final ThreadCommunication2 communication = new ThreadCommunication2(); Thread threadA = new Thread(new Runnable() { @Override public void run() { communication.printNumbers(); } }); Thread threadB = new Thread(new Runnable() { @Override public void run() { communication.printLetters(); } }); threadA.start(); threadB.start(); } }
Im obigen Beispiel wird durch die Dekoration des Codeblocks mit dem synchronisierten Schlüsselwort die Konsistenz der Reihenfolge und der gemeinsamen Daten zwischen Thread A und Thread B sichergestellt. Verwenden Sie Zahlenvariablen und Sperrobjekte, um die abwechselnde Ausführung zweier Threads zu steuern, und verwenden Sie die Methoden wait () und notifyAll (), um den gegenseitigen Ausschluss und die Kommunikation von Threads durchzuführen.
2. Verwenden Sie Lock und Condition, um die Kommunikation zwischen Threads und den Datenaustausch zu realisieren.
- Verwenden Sie ReentrantLock und Condition.
ReentrantLock ist eine von Java bereitgestellte wiedereintrittsfähige Mutex-Sperre, die zur Realisierung der Kommunikation und des Datenaustauschs zwischen Threads verwendet werden kann . Condition ist ein von ReentrantLock bereitgestelltes Bedingungsobjekt, das Threads über seine Methoden „await()“ und „signalAll()“ blockieren und aufwecken kann.
Beispielcode:
import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class ThreadCommunication3 { private Lock lock = new ReentrantLock(); private Condition numberCondition = lock.newCondition(); private Condition letterCondition = lock.newCondition(); private int number = 0; public void printNumbers() { lock.lock(); try { // 线程A负责打印奇数 for (int i = 1; i <= 10; i += 2) { while (number % 2 == 0) { try { numberCondition.await(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("ThreadA: " + i); number++; letterCondition.signalAll(); } } finally { lock.unlock(); } } public void printLetters() { lock.lock(); try { // 线程B负责打印偶数 for (char c = 'A'; c <= 'J'; c += 2) { while (number % 2 != 0) { try { letterCondition.await(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("ThreadB: " + c); number++; numberCondition.signalAll(); } } finally { lock.unlock(); } } public static void main(String[] args) { final ThreadCommunication3 communication = new ThreadCommunication3(); Thread threadA = new Thread(new Runnable() { @Override public void run() { communication.printNumbers(); } }); Thread threadB = new Thread(new Runnable() { @Override public void run() { communication.printLetters(); } }); threadA.start(); threadB.start(); } }
Im obigen Beispiel wird die Konsistenz der Reihenfolge und der gemeinsam genutzten Daten zwischen Thread A und Thread B durch die Verwendung von ReentrantLock und Condition erreicht. Verwenden Sie Zahlenvariablen, Sperrobjekte und Bedingungsobjekte, um die abwechselnde Ausführung zweier Threads zu steuern und Threads über die Methoden „await()“ und „signalAll()“ zu blockieren und aufzuwecken.
3. Verwenden Sie das Schlüsselwort volatile, um Daten zwischen Threads auszutauschen.
Das Schlüsselwort volatile kann zum Ändern von Variablen verwendet werden, um die Sichtbarkeit von Variablen für alle Threads sicherzustellen. Wenn ein Thread den Wert einer flüchtigen Variablen ändert, sehen andere Threads sofort den neuesten Wert und stellen so die Datenkonsistenz sicher.
Beispielcode:
public class ThreadCommunication4 { private volatile boolean flag = false; public void printNumbers() { // 线程A负责打印奇数 for (int i = 1; i <= 10; i += 2) { while (flag) { // 空循环,等待flag为false } System.out.println("ThreadA: " + i); flag = true; } } public void printLetters() { // 线程B负责打印偶数 for (char c = 'A'; c <= 'J'; c += 2) { while (!flag) { // 空循环,等待flag为true } System.out.println("ThreadB: " + c); flag = false; } } public static void main(String[] args) { final ThreadCommunication4 communication = new ThreadCommunication4(); Thread threadA = new Thread(new Runnable() { @Override public void run() { communication.printNumbers(); } }); Thread threadB = new Thread(new Runnable() { @Override public void run() { communication.printLetters(); } }); threadA.start(); threadB.start(); } }
Im obigen Beispiel wird durch die Verwendung des Schlüsselworts volatile zum Ändern der Flag-Variablen die Konsistenz der gemeinsam genutzten Daten zwischen Thread A und Thread B erreicht. Verwenden Sie die Flag-Variable, um die abwechselnde Ausführung der beiden Threads zu steuern, und warten Sie über eine leere Schleife auf den Wert des Flags.
Zusammenfassung:
In diesem Artikel werden mehrere gängige Lösungen für Probleme bei der Kommunikation zwischen Threads und beim Datenaustausch in Java vorgestellt, einschließlich der Verwendung des synchronisierten Schlüsselworts und von Lock and Condition zum Erreichen der Kommunikation zwischen Threads und der Verwendung des Schlüsselworts volatile zum Erreichen des Datenaustauschs. Alle oben genannten Lösungen können die Reihenfolge und Datenkonsistenz zwischen mehreren Threads sicherstellen. Welche Lösung zu wählen ist, hängt von den spezifischen Anforderungen und Szenarien ab. Bei der tatsächlichen Multi-Thread-Programmierung ist es notwendig, eine geeignete Lösung entsprechend der spezifischen Situation auszuwählen, um das Problem der Kommunikation zwischen Threads und des Datenaustauschs zu lösen und so die Korrektheit und Leistung des Programms sicherzustellen.
Das obige ist der detaillierte Inhalt vonSo lösen Sie Probleme bei der Kommunikation zwischen Threads und beim Datenaustausch in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

In dem Artikel werden Maven und Gradle für Java -Projektmanagement, Aufbau von Automatisierung und Abhängigkeitslösung erörtert, die ihre Ansätze und Optimierungsstrategien vergleichen.

In dem Artikel werden benutzerdefinierte Java -Bibliotheken (JAR -Dateien) mit ordnungsgemäßem Versioning- und Abhängigkeitsmanagement erstellt und verwendet, wobei Tools wie Maven und Gradle verwendet werden.

In dem Artikel wird in der Implementierung von mehrstufigem Caching in Java mithilfe von Koffein- und Guava-Cache zur Verbesserung der Anwendungsleistung erläutert. Es deckt die Einrichtungs-, Integrations- und Leistungsvorteile sowie die Bestrafung des Konfigurations- und Räumungsrichtlinienmanagements ab

In dem Artikel werden mit JPA für Objektrelationszuordnungen mit erweiterten Funktionen wie Caching und faulen Laden erläutert. Es deckt Setup, Entity -Mapping und Best Practices zur Optimierung der Leistung ab und hebt potenzielle Fallstricke hervor. [159 Charaktere]

Mit der Klassenbelastung von Java wird das Laden, Verknüpfen und Initialisieren von Klassen mithilfe eines hierarchischen Systems mit Bootstrap-, Erweiterungs- und Anwendungsklassenloadern umfasst. Das übergeordnete Delegationsmodell stellt sicher


Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Dreamweaver Mac
Visuelle Webentwicklungstools

PHPStorm Mac-Version
Das neueste (2018.2.1) professionelle, integrierte PHP-Entwicklungstool

SublimeText3 Englische Version
Empfohlen: Win-Version, unterstützt Code-Eingabeaufforderungen!

DVWA
Damn Vulnerable Web App (DVWA) ist eine PHP/MySQL-Webanwendung, die sehr anfällig ist. Seine Hauptziele bestehen darin, Sicherheitsexperten dabei zu helfen, ihre Fähigkeiten und Tools in einem rechtlichen Umfeld zu testen, Webentwicklern dabei zu helfen, den Prozess der Sicherung von Webanwendungen besser zu verstehen, und Lehrern/Schülern dabei zu helfen, in einer Unterrichtsumgebung Webanwendungen zu lehren/lernen Sicherheit. Das Ziel von DVWA besteht darin, einige der häufigsten Web-Schwachstellen über eine einfache und unkomplizierte Benutzeroberfläche mit unterschiedlichen Schwierigkeitsgraden zu üben. Bitte beachten Sie, dass diese Software

mPDF
mPDF ist eine PHP-Bibliothek, die PDF-Dateien aus UTF-8-codiertem HTML generieren kann. Der ursprüngliche Autor, Ian Back, hat mPDF geschrieben, um PDF-Dateien „on the fly“ von seiner Website auszugeben und verschiedene Sprachen zu verarbeiten. Es ist langsamer und erzeugt bei der Verwendung von Unicode-Schriftarten größere Dateien als Originalskripte wie HTML2FPDF, unterstützt aber CSS-Stile usw. und verfügt über viele Verbesserungen. Unterstützt fast alle Sprachen, einschließlich RTL (Arabisch und Hebräisch) und CJK (Chinesisch, Japanisch und Koreanisch). Unterstützt verschachtelte Elemente auf Blockebene (wie P, DIV),