


Programmation simultanée Java, introduisant les classes auxiliaires couramment utilisées
Recommandations d'apprentissage gratuites associées : Tutoriel de base Java
Classes auxiliaires couramment utilisées
- 1.CountDownLatch
- Exemple : Problème de verrouillage de porte du moniteur
- 1.2. Introduction à la classe CountDownLatch :
- 1.2.1 Concept CountDownLatch
- 1.2.3 Utilisation du cas CountDownLatch
- 1.3.Cas CountDownLatch :
- 1.4.Résumé des principes
- 2. CyclicBarrier
-
- 2.1. 2.2. Cas : Récupérez 7 Dragon Balls pour invoquer le dragon
- 3.1. 3.2. La problématique des places de stationnement
- 3.3.Résumé des principes
Description du problème : Supposons qu'il y ait 7 étudiants qui étudient le soir. Le moniteur a la clé et est responsable du verrouillage de la porte. Le moniteur doit attendre que tout le monde soit parti avant de pouvoir éteindre les lumières et verrouiller la porte. L’ordre de ces six étudiants n’est pas ordonné, et je ne sais pas quand ils sont partis. Chacun des six étudiants a suivi ses propres cours d'auto-apprentissage, sans aucune interaction entre les deux. Si les 6 étudiants sont des threads ordinaires et que le moniteur est le thread principal, comment pouvons-nous faire en sorte que le thread principal attende qu'un groupe de threads termine son exécution avant que le thread principal puisse terminer son exécution ? 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班长关门走人");
}}
Enfin, il y a trois personnes enfermées dans le professeur. Cela peut provoquer des accidents, donc ce n'est certainement pas possible.
Si nous voulons obtenir cet effet, nous devons attendre que tous les autres threads aient fini de s'exécuter avant que le thread principal puisse s'exécuter. Vous devez utiliser la classe CountDownLatch dans JUC1.2 Introduction à la classe CountDownLatch :
CountDownLatch est une classe d'outils de synchronisation utilisée pour coordonner la synchronisation entre plusieurs threads, ou la communication entre les threads (plutôt que de servir d'exclusion mutuelle).
CountDownLatch permet à un thread d'attendre que d'autres threads terminent leur travail avant de continuer à s'exécuter . Utilisez un compteur pour mettre en œuvre. La valeur initiale du compteur est le nombre de threads. Lorsque chaque thread termine sa tâche, la valeur du compteur sera décrémentée de un. Lorsque la valeur du compteur est 0, cela signifie que tous les threads ont terminé certaines tâches, puis les threads en attente sur CountDownLatch peuvent reprendre l'exécution des tâches suivantes
.Description de CountDownLatch : décompte, décompte, démarrage du loquet
1.2.3 Utilisation de CountDownLatchUn certain fil démarre Attendez pour que n threads terminent l'exécution avant de s'exécuter. Initialisez le compteur CountDownLatch à new CountDownLatch(n). Chaque fois qu'un thread de tâche termine son exécution, le compteur est décrémenté de 1 countdownLatch.countDown() Lorsque la valeur du compteur devient 0, le thread wait() sur CountDownLatch sera réveillé. Un scénario d'application typique est que lors du démarrage d'un service, le thread principal doit attendre que plusieurs composants soient chargés avant de poursuivre l'exécution.
Code source du constructeur sous-jacent de CountDownLatch
public CountDownLatch(int count) { if (count <p><strong>1.3.Cas CountDownLatch : </strong></p><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班长关门走人"); }
Capture d'écran des résultats en cours d'exécution
Ici Nous ne savons pas quand tout le monde partira, mais nous pouvons garantir que le chef d'équipe sera le dernier à partir à chaque fois.
1.4.Résumé des principes
CountDownLatch a principalement deux méthodes Lorsqu'un ou plusieurs threads appellent la méthode wait, ces threads seront bloqués. L'appel de la méthode countDown par d'autres threads décrémentera le compteur de 1 (le thread appelant la méthode countDown ne sera pas bloqué)
Lorsque la valeur du compteur devient 0, le thread bloqué par la méthode wait sera réveillé et exécuté continuera.
2. CyclicBarrier
2.1. Introduction à CyclicBarrier
Du sens littéral, le sens chinois de cette classe est « clôture circulante ». Cela signifie en gros une barrière recyclable. Sa fonction est de faire attendre que tous les threads soient terminés avant de passer à l'étape suivante.
L'exemple ci-dessus du chef d'équipe fermant la porte fait un compte à rebours, ici c'est l'inverse, faisant une addition, en commençant lorsque le nombre est atteint. Par exemple, lorsque tout le monde est là, recommencez la réunion.
par exemple, tout comme dans la vie, nous inviterons des collègues à aller à une réunion. Certains collègues peuvent arriver en avance et certains collègues peuvent arriver en retard, mais cette réunion stipule qu'il faut attendre que tout le monde soit arrivé avant de pouvoir officiellement. Ayez une réunion. Les collègues ici sont le fil conducteur, et la réunion est la CyclicBarrier.
Méthode constructeur
public CyclicBarrier(int parties)public CyclicBarrier(int parties, Runnable barrierAction)
les parties sont le nombre de threads participants
La deuxième méthode constructeur a un paramètre Runnable, ce qui signifie que le dernier Pour atteindre le tâche à effectuer par le thread nous utilisons généralement le deuxième constructeur.
2.2. Cas : Récupérez 7 boules de dragon pour invoquer le dragon 截图 3.Semophore 3.1.Semophore简介 前面讨论的问题都是多对一的问题,我们现在可以讨论多对多的问题了。 假设有7个兄弟开车上班,而现在只有4个车位。7部车并列开进4个车位,每个车停了多长时间未知,资源被占用完了。假设有一个车只停了2s,那么它走了,外面的车又可以进来了。走一个进一个,最后全部都可以进去。而semophore就是控制多线程的并发策略。 简单理解来说,Semaphore:信号量主要用于两个目的:一个是用于多个共享资源的互斥使用;另一个用于并发线程数量的控制。 Semaphore类有两个重要方法 1、semaphore.acquire(); 2、semaphore.release(); 3.2.抢车位问题 运行结果截图: 3.3.原理总结 在信号量上我们定义两种操作: acquire(获取)当一个线程调用acquire操作时,它要么通过成功获取信号量(信号量减1),要么一直等待下去,直到有线程释放信号量,或超时。 release(释放)实际上会将信号量的值加1,然后唤醒等待的线程。 信号量主要用于两个目的:一个是用于多个共享资源的互斥使用;另一个用于并发线程数量的控制 如果把资源数从3变成1了,此时就等价于synchronized。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();;
}
}
请求一个信号量,这时候信号量个数-1,当减少到0的时候,下一次acquire不会再执行,只有当执行一个release()的时候,信号量不为0的时候才可以继续执行acquire
释放一个信号量,这时候信号量个数+1,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();
}
}
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment gérer l'accès simultané dans le développement de fonctions backend Java ? Dans les applications Internet modernes, un accès simultané élevé constitue un défi courant. Lorsque plusieurs utilisateurs accèdent aux services backend en même temps, si la simultanéité n'est pas gérée correctement, cela peut entraîner des problèmes tels que la cohérence des données, les performances et la sécurité. Cet article présentera quelques bonnes pratiques pour gérer les accès simultanés dans le développement backend Java. 1. Utiliser la synchronisation des threads Java fournit une variété de mécanismes pour gérer les accès simultanés, le plus couramment utilisé étant la synchronisation des threads. En ajoutant la synchronisation avant les blocs ou méthodes de code clé

Comment créer des tâches parallèles à l'aide du framework Fork/Join en Java ? Définissez la logique des tâches, calculez les résultats ou effectuez des actions. Créez un ForkJoinPool pour gérer les threads parallèles. Utilisez la méthode fork() pour soumettre des tâches. Utilisez la méthode join() pour obtenir les résultats de la tâche.

Réponse : Le mécanisme de réflexion permet aux programmes Java d'inspecter et de modifier des classes et des objets au moment de l'exécution via l'API de réflexion, qui peut être utilisée pour implémenter des mécanismes de concurrence flexibles dans la concurrence Java. Application : créez dynamiquement des threads. Changez dynamiquement la priorité du thread. Injecter des dépendances.

Comment résoudre : Erreur de concurrence Java : Détection de blocage Le blocage est un problème courant dans la programmation multithread. Un blocage se produit lorsque deux threads ou plus s'attendent pour libérer une ressource verrouillée. Un blocage entraînera le blocage des threads, les ressources ne pourront pas être libérées et les programmes ne pourront pas continuer à s'exécuter, ce qui entraînera une panne du système. Pour résoudre ce problème, Java fournit un mécanisme de détection des interblocages. La détection des blocages détermine s'il existe un blocage en vérifiant les dépendances entre les threads et la situation de mise en file d'attente des applications de ressources. Une fois qu'un blocage est détecté, le système peut prendre les mesures correspondantes.

File d'attente de blocage : un outil puissant pour la concurrence et le multithreading Blocking Queue est une file d'attente thread-safe qui joue les rôles clés suivants dans la programmation simultanée et multithread : Synchronisation des threads : empêche les conditions de concurrence et les incohérences de données en bloquant les opérations. Tampon de données : en tant que tampon de données, il atténue le problème de non-concordance des vitesses des threads producteur et consommateur. Équilibrage de charge : contrôlez le nombre d'éléments dans la file d'attente et équilibrez la charge des producteurs et des consommateurs.

Façons de résoudre les erreurs et exceptions de conditions de concurrence concurrentielle Java Les conditions de concurrence font référence au moment où plusieurs threads accèdent et modifient des ressources partagées en même temps, et l'exactitude du résultat final est affectée par l'ordre d'exécution. En Java, lorsque plusieurs threads accèdent simultanément à des ressources partagées, des erreurs de condition de concurrence se produisent si le mécanisme de synchronisation n'est pas utilisé correctement. Lorsqu'une erreur de condition de concurrence se produit, le programme peut produire des résultats inattendus ou même planter. Cet article explique comment résoudre les exceptions d'erreur de condition de concurrence concurrentielle Java. 1. Le moyen le plus courant de résoudre les conditions de concurrence à l'aide de mécanismes de synchronisation

Comment résoudre : Erreur de concurrence Java : blocage des threads Introduction : le blocage des threads est un problème très courant dans la programmation simultanée. Lorsque plusieurs threads sont en compétition pour les ressources, un blocage peut se produire si les threads attendent les uns les autres pour libérer des ressources. Cet article présentera le concept de blocage de thread, ses causes et comment résoudre ce problème. Le concept de blocage de thread se produit lorsque plusieurs threads s'attendent pour libérer des ressources, ce qui empêche tous les threads de continuer à s'exécuter, formant ainsi un blocage de thread. Un blocage de thread se produit généralement parce que les quatre conditions suivantes sont vraies en même temps

CountDownLatch et CyclicBarrier sont tous deux utilisés dans des environnements multithread et font tous deux partie d'environnements multithread. Selon JavaDoc - CountDownLatch - Une aide à la synchronisation qui permet à un ou plusieurs threads d'attendre qu'un ensemble d'opérations effectuées dans d'autres threads soit terminé. CyclicBarrier - Une aide à la synchronisation qui permet à un groupe de threads d'attendre les uns les autres pour atteindre un point de barrière commun. Messieurs. KeyCyclicBarrierCountDownLatch1 permet essentiellement à un groupe de threads d'être assistés de manière synchrone, tous attendant les uns les autres pour atteindre un point de barrière commun. Une aide à la synchronisation qui permet à un ou plusieurs threads d'attendre un ensemble d'opérations effectuées dans d'autres threads.
