Heim Java JavaBase Parallele Java-Programmierung, Einführung häufig verwendeter Hilfsklassen

Parallele Java-Programmierung, Einführung häufig verwendeter Hilfsklassen

Feb 02, 2021 pm 05:38 PM
java并发

Parallele Java-Programmierung, Einführung häufig verwendeter Hilfsklassen

Verwandte kostenlose Lernempfehlungen: Java-Grundlagen-Tutorial

Häufig verwendete Hilfsklassen

  • 1.CountDownLatch
    • 1.2. Türschlossproblem überwachen
    • 1.2. Einführung in die CountDownLatch-Klasse:
      • 1.2.1 CountDownLatch-Konzept
      • 1.2.3 Verwendung von CountDownLatch
    • 1.3.CountDownLatch-Fall:
    • 1.4. Prinzipielle Zusammenfassung
  • 2 clicBarrier
    • 2.1. CyclicBarrier Einführung
    • 2. Fall: Sammle 7 Drachenbälle, um den Drachen zu beschwören
  • 3
    • 1. CountDownLatch
    • 1.2. Beispiel: Der Monitor schließt die Tür ab
    Problembeschreibung: Angenommen, abends lernen 7 Schüler, der Monitor hat den Schlüssel und er ist für das Abschließen der Tür verantwortlich. Der Monitor muss warten, bis alle weg sind, bevor er das Licht ausschalten und die Tür abschließen kann. Die Reihenfolge dieser sechs Schüler ist nicht in Ordnung, und ich weiß nicht, wann sie gegangen sind. Jeder der sechs Studenten nahm an seinen eigenen Selbstlernkursen teil, ohne dass es zu einer Interaktion zwischen ihnen kam. Wenn es sich bei den 6 Schülern um normale Threads handelt und der Monitor der Hauptthread ist, wie können wir dann den Hauptthread warten lassen, bis die Ausführung einer Reihe von Threads beendet ist, bevor der Hauptthread die Ausführung beenden kann?
public class CountDownLatchDemo {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		for(int i=1;i{
				System.out.println(Thread.currentThread().getName()+"\t离开教室");
			},String.valueOf(i)).start();
		}
		System.out.println(Thread.currentThread().getName()+"\t班长关门走人");
	}}
Nach dem Login kopieren
Screenshot der Laufergebnisse

Schließlich sind drei Personen im Lehrerzimmer eingesperrt. Dies kann zu Unfällen führen, ist also definitiv nicht möglich.

Wenn wir diesen Effekt erzielen möchten, müssen wir warten, bis alle anderen Threads ausgeführt wurden, bevor der Hauptthread ausgeführt werden kann. Sie müssen die CountDownLatch-Klasse in JUC verwenden

1.2. Einführung in die CountDownLatch-Klasse:


1.2.1 CountDownLatch-Konzept Parallele Java-Programmierung, Einführung häufig verwendeter Hilfsklassen

CountDownLatch ist eine Synchronisierungstoolklasse, die zur Koordinierung der Synchronisierung zwischen mehreren Threads oder auf andere Weise verwendet wird Wörter dienen der Kommunikation zwischen Threads (und nicht als gegenseitiger Ausschluss).

CountDownLatch ermöglicht es einem Thread, darauf zu warten, dass andere Threads ihre Arbeit abschließen, bevor er mit der Ausführung fortfährt

.

Verwenden Sie zur Umsetzung einen Zähler. Der Anfangswert des Zählers ist die Anzahl der Threads. Wenn jeder Thread seine Aufgabe abschließt, wird der Zählerwert um eins verringert. Wenn der Zählerwert 0 ist, bedeutet dies, dass alle Threads einige Aufgaben abgeschlossen haben und die auf CountDownLatch wartenden Threads dann mit der Ausführung der nächsten Aufgaben fortfahren können.

CountDownLatch-Beschreibung: Anzahl zählen, herunterzählen, Latch starten

1.2.3 Verwendung von CountDownLatch

Ein bestimmter Thread wartet, bis die Ausführung von n Threads abgeschlossen ist, bevor er mit der Ausführung beginnt. Initialisieren Sie den CountDownLatch-Zähler auf den neuen CountDownLatch(n). Immer wenn ein Task-Thread die Ausführung abschließt, wird der Zähler um 1 verringert. countdownLatch.countDown() Wenn der Zählerwert 0 wird, wird der Thread waiting() auf CountDownLatch aktiviert. Ein typisches Anwendungsszenario besteht darin, dass der Hauptthread beim Starten eines Dienstes warten muss, bis mehrere Komponenten geladen sind, bevor er mit der Ausführung fortfahren kann. CountDownLatch zugrunde liegender Konstruktor-Quellcode

public CountDownLatch(int count) {
        if (count <p></p>1.3. CountDownLatch-Fall: <p><strong><pre class="brush:php;toolbar:false">public static void main(String[] args) throws InterruptedException {
		//6个同学正在上自习,每个人就有一个1计数器,走1个数字减1,main线程启动,必须要等计时器从6变成0,才能开始。
		CountDownLatch countDownLatch=new CountDownLatch(6);
		for(int i=1;i{
				System.out.println(Thread.currentThread().getName()+"\t离开教室");
				countDownLatch.countDown();		//计算减少一个
			},String.valueOf(i)).start();
		}
		countDownLatch.await();	//班长前面需要被阻塞
		System.out.println(Thread.currentThread().getName()+"\t班长关门走人");
	}
Nach dem Login kopieren
Screenshot der laufenden Ergebnisse

Ich weiß nicht, wann alle hier gehen werden, aber Sie können garantieren, dass der Truppführer der letzte sein wird Einer, der jedes Mal gehen muss.

1.4. Prinzipielle Zusammenfassung

CountDownLatch verfügt hauptsächlich über zwei Methoden. Wenn ein oder mehrere Threads die Wait-Methode aufrufen, werden diese Threads blockiert.

Der Aufruf der CountDown-Methode durch andere Threads verringert den Zähler um 1 (der Thread, der die CountDown-Methode aufruft, wird nicht blockiert).
Wenn der Zählerwert 0 wird, wird der von der Wait-Methode blockierte Thread aktiviert und die Ausführung wird fortgesetzt. Parallele Java-Programmierung, Einführung häufig verwendeter Hilfsklassen

2.CyclicBarrier

2.1. Einführung in CyclicBarrier

zyklischer Zyklus, Barrierebarriere.
Aus der wörtlichen Bedeutung können wir erkennen, dass die chinesische Bedeutung dieser Klasse „umlaufender Zaun“ ist. Es bedeutet in etwa eine recycelbare Barriere.

Seine Funktion besteht darin, alle Threads auf den Abschluss warten zu lassen, bevor mit dem nächsten Schritt fortgefahren wird. Das obige Beispiel, in dem der Monitor die Tür schließt, dient dazu, einen Countdown durchzuführen, hier ist es umgekehrt, eine Addition durchzuführen und zu starten, wenn die Zahl erreicht ist.

Wenn zum Beispiel alle da sind, starten Sie das Meeting erneut. Wie im Leben würden wir beispielsweise Kollegen bitten, gemeinsam zu einem Meeting zu gehen. Einige Kollegen kommen möglicherweise früher und einige Kollegen kommen möglicherweise zu spät. Bei diesem Meeting müssen wir jedoch warten, bis alle angekommen sind das Treffen offiziell eröffnen. Die Kollegen hier sind die Threads und das Treffen ist die CyclicBarrier.

Konstruktionsmethode

public CyclicBarrier(int parties)public CyclicBarrier(int parties, Runnable barrierAction)
Nach dem Login kopieren

Analyse:
parties ist die Anzahl der teilnehmenden Threads Die zweite Konstruktionsmethode hat einen Runnable-Parameter, der die vom letzten ankommenden Thread auszuführende Aufgabe bedeutet

Wir verwenden normalerweise den zweiten Konstruktor .

2.2. Fall: Sammle 7 Drachenbälle, um den Drachen zu beschwören

public static void main(String[] args) {
		// TODO Auto-generated method stub
		CyclicBarrier cyclicBarrier=new CyclicBarrier(7,()->{System.out.println("召唤神龙");});
		for(int i=1;i{
				System.out.println(Thread.currentThread().getName()+"\t收集到第"+tempInt+"颗龙珠");
				try {
					//某个线程收集到了龙珠只能先等着,等龙珠收齐了才能召唤神龙
					cyclicBarrier.await();
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			},String.valueOf(i)).start();;
		}
	}
Nach dem Login kopieren

截图
Parallele Java-Programmierung, Einführung häufig verwendeter Hilfsklassen

3.Semophore

3.1.Semophore简介

前面讨论的问题都是多对一的问题,我们现在可以讨论多对多的问题了。

假设有7个兄弟开车上班,而现在只有4个车位。7部车并列开进4个车位,每个车停了多长时间未知,资源被占用完了。假设有一个车只停了2s,那么它走了,外面的车又可以进来了。走一个进一个,最后全部都可以进去。而semophore就是控制多线程的并发策略。

简单理解来说,Semaphore:信号量主要用于两个目的:一个是用于多个共享资源的互斥使用;另一个用于并发线程数量的控制。

Semaphore类有两个重要方法

1、semaphore.acquire();
请求一个信号量,这时候信号量个数-1,当减少到0的时候,下一次acquire不会再执行,只有当执行一个release()的时候,信号量不为0的时候才可以继续执行acquire

2、semaphore.release();
释放一个信号量,这时候信号量个数+1,

3.2.抢车位问题

public static void main(String[] args) {
		//模拟6部车抢3个空车位
		Semaphore semaphore=new Semaphore(3);//模拟资源类,有3个空车位
		for(int i=1;i{
				try {
					//谁先抢到了,谁就占一个车位,并且要把semaphore中的资源数减1
					semaphore.acquire();
					System.out.println(Thread.currentThread().getName()+"\t抢占到了车位");
					TimeUnit.SECONDS.sleep(3);
					System.out.println(Thread.currentThread().getName()+"\t离开了车位");
					
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}finally{
					//释放车位
					semaphore.release();
				}
				
			},String.valueOf(i)).start();
		}
	}
Nach dem Login kopieren

运行结果截图:
Parallele Java-Programmierung, Einführung häufig verwendeter Hilfsklassen

3.3.原理总结

在信号量上我们定义两种操作:

acquire(获取)当一个线程调用acquire操作时,它要么通过成功获取信号量(信号量减1),要么一直等待下去,直到有线程释放信号量,或超时。

release(释放)实际上会将信号量的值加1,然后唤醒等待的线程。

信号量主要用于两个目的:一个是用于多个共享资源的互斥使用;另一个用于并发线程数量的控制

如果把资源数从3变成1了,此时就等价于synchronized。

Das obige ist der detaillierte Inhalt vonParallele Java-Programmierung, Einführung häufig verwendeter Hilfsklassen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Chat -Befehle und wie man sie benutzt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Wie gehe ich mit gleichzeitigem Zugriff bei der Entwicklung von Java-Backend-Funktionen um? Wie gehe ich mit gleichzeitigem Zugriff bei der Entwicklung von Java-Backend-Funktionen um? Aug 04, 2023 pm 08:22 PM

Wie gehe ich mit gleichzeitigem Zugriff bei der Entwicklung von Java-Backend-Funktionen um? In modernen Internetanwendungen ist ein hoher gleichzeitiger Zugriff eine häufige Herausforderung. Wenn mehrere Benutzer gleichzeitig auf Backend-Dienste zugreifen und die Parallelität nicht ordnungsgemäß gehandhabt wird, kann dies zu Problemen wie Datenkonsistenz, Leistung und Sicherheit führen. In diesem Artikel werden einige Best Practices für den Umgang mit gleichzeitigem Zugriff in der Java-Backend-Entwicklung vorgestellt. 1. Verwenden Sie die Thread-Synchronisierung. Java bietet eine Vielzahl von Mechanismen für den gleichzeitigen Zugriff. Der am häufigsten verwendete Mechanismus ist die Thread-Synchronisierung. Durch Hinzufügen einer Synchronisierung vor Schlüsselcodeblöcken oder -methoden

Wie verwende ich das Fork/Join-Framework in Java-Funktionsparallelität und Multithreading? Wie verwende ich das Fork/Join-Framework in Java-Funktionsparallelität und Multithreading? Apr 27, 2024 am 10:09 AM

Wie erstelle ich parallele Aufgaben mit dem Fork/Join-Framework in Java? Definieren Sie Aufgabenlogik, berechnen Sie Ergebnisse oder führen Sie Aktionen aus. Erstellen Sie einen ForkJoinPool, um parallele Threads zu verwalten. Verwenden Sie die Methode fork(), um Aufgaben zu übermitteln. Verwenden Sie die Methode „join()“, um die Aufgabenergebnisse abzurufen.

Anwendung des Reflexionsmechanismus in der Java-Parallelität? Anwendung des Reflexionsmechanismus in der Java-Parallelität? Apr 15, 2024 pm 09:03 PM

Antwort: Der Reflexionsmechanismus ermöglicht es Java-Programmen, Klassen und Objekte zur Laufzeit über die Reflexions-API zu überprüfen und zu ändern, was zur Implementierung flexibler Parallelitätsmechanismen in der Java-Parallelität verwendet werden kann. Anwendung: Threads dynamisch erstellen. Thread-Priorität dynamisch ändern. Abhängigkeiten einfügen.

So beheben Sie: Java-Parallelitätsfehler: Deadlock-Erkennung So beheben Sie: Java-Parallelitätsfehler: Deadlock-Erkennung Aug 25, 2023 pm 10:03 PM

So lösen Sie: Java-Parallelitätsfehler: Deadlock-Erkennung Deadlock ist ein häufiges Problem bei der Multithread-Programmierung. Ein Deadlock tritt auf, wenn zwei oder mehr Threads darauf warten, dass der andere eine gesperrte Ressource freigibt. Deadlock führt dazu, dass Threads blockiert werden, Ressourcen nicht freigegeben werden können und Programme nicht weiter ausgeführt werden können, was zu einem Systemausfall führt. Um dieses Problem zu lösen, bietet Java einen Deadlock-Erkennungsmechanismus. Die Deadlock-Erkennung ermittelt, ob ein Deadlock vorliegt, indem die Abhängigkeiten zwischen Threads und der Warteschlangensituation der Ressourcenanwendung überprüft werden. Sobald ein Deadlock gefunden wird, kann das System entsprechende Maßnahmen ergreifen.

Welche Rolle spielt die Blockierungswarteschlange bei der Parallelität und dem Multithreading von Java-Funktionen? Welche Rolle spielt die Blockierungswarteschlange bei der Parallelität und dem Multithreading von Java-Funktionen? Apr 27, 2024 am 09:30 AM

Blocking Queue: Ein leistungsstarkes Tool für Parallelität und Multithreading. Blocking Queue ist eine Thread-sichere Warteschlange, die die folgenden Schlüsselrollen bei der gleichzeitigen und Multithread-Programmierung spielt: Thread-Synchronisierung: Verhindert Race Conditions und Dateninkonsistenzen durch Blockieren von Vorgängen. Datenpuffer: Als Datenpuffer lindert er das Problem der Nichtübereinstimmung der Thread-Geschwindigkeiten von Produzenten und Konsumenten. Lastausgleich: Steuern Sie die Anzahl der Elemente in der Warteschlange und gleichen Sie die Last von Produzenten und Verbrauchern aus.

Methoden zum Lösen der Java-Parallelitäts-Race-Condition-Fehlerausnahme (ConcurrentRaceConditionErrorExceotion) Methoden zum Lösen der Java-Parallelitäts-Race-Condition-Fehlerausnahme (ConcurrentRaceConditionErrorExceotion) Aug 26, 2023 pm 12:57 PM

Möglichkeiten zur Lösung von Java-Parallelitäts-Race-Condition-Fehlern und -Ausnahmen Race-Bedingungen beziehen sich darauf, dass mehrere Threads gleichzeitig auf gemeinsam genutzte Ressourcen zugreifen und diese ändern und die Richtigkeit des Endergebnisses durch die Ausführungsreihenfolge beeinflusst wird. Wenn in Java mehrere Threads gleichzeitig auf gemeinsam genutzte Ressourcen zugreifen, treten Race-Condition-Fehler auf, wenn der Synchronisierungsmechanismus nicht korrekt verwendet wird. Wenn ein Race-Condition-Fehler auftritt, kann das Programm unerwartete Ergebnisse liefern oder sogar abstürzen. In diesem Artikel wird erläutert, wie Fehlerausnahmen bei Java-Parallelitäts-Race-Bedingungen behoben werden. 1. Der gebräuchlichste Weg, Race-Bedingungen mithilfe von Synchronisationsmechanismen zu lösen

So beheben Sie: Java-Parallelitätsfehler: Thread-Deadlock So beheben Sie: Java-Parallelitätsfehler: Thread-Deadlock Aug 18, 2023 pm 05:57 PM

So lösen Sie: Java-Parallelitätsfehler: Thread-Deadlock Einführung: Thread-Deadlock ist ein sehr häufiges Problem bei der gleichzeitigen Programmierung. Wenn mehrere Threads um Ressourcen konkurrieren, kann es zu einem Deadlock kommen, wenn die Threads darauf warten, dass die anderen Threads Ressourcen freigeben. In diesem Artikel werden das Konzept des Thread-Deadlocks, seine Ursachen und die Lösung dieses Problems vorgestellt. Das Konzept des Thread-Deadlocks tritt auf, wenn mehrere Threads darauf warten, dass einander Ressourcen freigibt, was dazu führt, dass alle Threads nicht mehr in der Lage sind, die Ausführung fortzusetzen, was zu einem Thread-Deadlock führt. Ein Thread-Deadlock tritt normalerweise auf, weil die folgenden vier Bedingungen gleichzeitig zutreffen

Was ist der Unterschied zwischen CountDownLatch und CyclicBarrier in der Java-Parallelität? Was ist der Unterschied zwischen CountDownLatch und CyclicBarrier in der Java-Parallelität? Sep 06, 2023 pm 03:33 PM

Sowohl CountDownLatch als auch CyclicBarrier werden in Multithread-Umgebungen verwendet und sind beide Teil von Multithread-Umgebungen. Laut JavaDoc ist CountDownLatch eine Synchronisationshilfe, die es einem oder mehreren Threads ermöglicht, zu warten, bis eine Reihe von in anderen Threads ausgeführten Operationen abgeschlossen ist. CyclicBarrier – Eine Synchronisationshilfe, die es einer Gruppe von Threads ermöglicht, darauf zu warten, dass die anderen einen gemeinsamen Barrierenpunkt erreichen. Herren. KeyCyclicBarrierCountDownLatch1 ermöglicht grundsätzlich die Synchronisierung einer Reihe von Threads, die alle darauf warten, dass sie einen gemeinsamen Barrierepunkt erreichen. Eine Synchronisationshilfe, die es einem oder mehreren Threads ermöglicht, auf eine Reihe von Operationen zu warten, die in anderen Threads ausgeführt werden.

See all articles