Java Multithreading - producer Consumer issues, From Basic to Deep case

Harmonios Learning 2021-11-25 19:07:09
java multithreading producer consumer issues

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

}

Supposons queStudentLes étudiants sont des étagères,nameNom etageL'âge est la marchandise sur l'étagère.EtflagLe panneau indique si l'étagère est vide..

Le fil consommateur obtient le nom et l'âge de l'étudiant égal au fil consommateur obtient le produit.Le producteur attribue un nouveau nom et une nouvelle valeur d'âge à l'objet étudiant,équivalent à la production de biens par les producteurs

Ici, les consommateurs obtiennentnameEtageJuste...flagSet tofalse,C'est - à - dire que l'étagère est vide.Et le producteur donnenameEtageDéfinir une nouvelle valeur,Juste...flagSet totrue,C'est - à - dire que l'étagère est pleine

Avant d'écrire le Code pour les fils des producteurs et des consommateurs,D'abord, il y a quelques problèmes à résoudre.:

  1. Nous voulons nous assurer que les producteurs et les consommateurs,Fonctionne sur le même objet étudiant.

Parce que les biens consommés par les consommateurs doivent être produits par les producteurs.,Si l'objet de l'opération est différent,Les consommateurs n'auront jamais accès à la marchandise..

La solution est:Construire des objets étudiants en dehors de la méthode principale,Ensuite, une méthode de construction paramétrique est ajoutée aux producteurs et aux consommateurs,Transmettre les objets étudiants comme paramètres aux producteurs et aux consommateurs.Au lieu de créer un nouvel objet étudiant à l'intérieur du thread

  1. Est - ce qu'il s'agit d'un problème de sécurité du fil,Voici trois conditions pour la sécurité des fils

(1)Existe - t - il un environnement multithreadé (Existe,Fils de producteurs et de consommateurs)

(2)Existe - t - il des données partagées (Existe,StudentObjet)

(3)Y a - t - il plus d'une instruction qui gère les données partagées (- Oui.)

Solutions:synchronized,Bloc de code de synchronisation

Quand le producteur assigne une valeur à l'objet,Le consommateur ne peut pas manipuler la valeur de l'objet,Évitez que le producteur ne donne qu'à l'objetnameAffectation,Et les consommateurs ont misnameEtageSi toutes les valeurs de

  1. Le thread a attrapéCPUAprès,Peut fonctionner plusieurs fois en très peu de temps.

Il n'y a peut - être qu'une seule étagère,Une fois que le producteur a fini de produire la marchandise,Je n'ai pas encore attendu le consommateur pour récupérer,La production continue de nouveaux produits pour remplacer les anciens sur les étagères.Ou le consommateur a retiré la marchandise,Toujours en train de ramasser des marchandises sur des étagères vides.

Solutions:Ajouter un mécanisme de réveil en attente

Attendez que le mécanisme de réveil passeObjectTrois méthodes dans la classe pour implémenter(Attention, oui.Object,Non, pas du tout.Thread):

void wait() Provoque l'attente du fil courant,Jusqu'à ce qu'un autre thread appelle notify()Méthode ou notifyAll()Méthodes.

void notify() Réveiller un seul thread en attente d'un moniteur d'objet.

void notifyAll() Réveiller tous les Threads qui attendent le moniteur d'objet.

L'utilisation spécifique de ces trois méthodes est:

  1. wait()

En appelant wait()Avant,Le thread doit obtenir le verrouillage du moniteur d'objet pour l'objet correspondant(Ici.StudentObjet),Il ne peut donc être appelé que dans une méthode de synchronisation ou un bloc de synchronisation wait()Méthodes.Appel d'objetwait()Après la méthode,Le thread actuel libère immédiatement la serrure,Puis il est en hibernation,Jusqu'à ce quenotify()Se réveiller ou être interrompu.En même temps, l'exécution du thread se fera àwait()Arrêt à l'instruction,Jusqu'à ce que la serrure soit rétablie,Le thread actuel est disponible à partir dewait()Méthode retournée avec succès,Puis continuez avec le code suivant.En plus,Les verrous libérés sont immédiatement saisis par d'autres fils qui attendent les verrous,Le thread qui a attrapé la serrure a commencé à exécuter le bloc de synchronisation.

  1. notify()

notify()Il faut aussi obtenir une serrure,Et ne peut être appelé que dans une méthode de synchronisation ou un bloc de code de synchronisation.Appel courant du threadnotify()Après,Avant de se réveillerwait()Le fil qui s'est endormi,Faites - le passer de la file d'attente à la file d'attente de synchronisation,Obtenir la serrure du fil courant,Et depuiswait()Continuer à l'instruction(Ceci exige que les objets de la serrure d'objet soient cohérents,Pour se réveiller).Quand il y a plus de Threads en attente de réveil,Un réveil de fil est sélectionné au hasard selon le mécanisme.Appel courant du threadnotify()La serrure ne sera pas libérée immédiatement après la méthode,Au lieu de cela, continuez,Jusqu'à ce que la fin de l'exécution quitte la méthode de synchronisation ou le bloc de code de synchronisation,Pour libérer la serrure.

  1. notifyAll()

notifyAll()Avecnotify()Et fonctionne à peu près de la même façon,La différence, c'est qu'en attendant plus de fils,notify()Une notification de thread est sélectionnée au hasard,EtnotifyAll()Réveillera tous les Threads avec la même serrure d'objet,Laissez ces fils se battre pour les serrures.

Attention iciwait()Avecnotify(),notifyAll()Le pont de contact est le même objet,C'est - à - dire:synchronized(Objet){ },Entre les différents fils,Les objets entre parenthèses sont les mêmes

Fils de producteur

package test.MyThread.ProductDemo;

public class SetThread implements Runnable{

Student s ;

int x = 0;

public SetThread(Student s){

this.s = s;

}

@Override

public void run() {

while(true){

synchronized(s){

if(s.flag){

//Description l'objet étudiant a reçu une valeur,Il faut attendre que les consommateurs obtiennent

try {

s.wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

}else{

//Voici deux catégories de produits,Quandx%2==0Sur les étagères quand les fruits,Sinon, mettez du pain sur les étagères

//C'est dans la catégorie des étudiants pour être un étudiant appelé fruit,Un étudiant appelé pain

if(x%2==0){

s.setName(“Fruits”);

s.setAge(1

《Grandes usines de première ligneJavaAnalyse des questions d'entrevue+Notes d'apprentissage pour le développement de l'arrière - plan+La dernière vidéo d'architecture+Document d'information sur le code source du projet en direct》

【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 Partage open source du contenu complet

8);

}else{

s.setName(“Pain”);

s.setAge(15);

}

x++;

//Affectation terminée.,Changer l'état entrue,Et informer le consommateur de la valeur

s.flag = true;

s.notify();

}

}

}

}

}

Thread consommateur

package test.MyThread.ProductDemo;

public class GetThread implements Runnable{

Student s ;

public GetThread(Student s){

this.s = s;

}

@Override

public void run() {

while(true){

synchronized(s){

 //s.flagPourfalseHeure,!s,flagPourtrue,ExécutionifDéclarations

if(!s.flag){

try {

s.wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

System.out.println(s.name + “—” + s.age);

s.notify();

s.flag = false;

Contenu final

Au début, j'ai dit,Je ne suis pas prêt pour l'interview,Tout dépend de l'accumulation habituelle,C'est un peu temporaire,Au point que je suis encore très contrarié.(Peut - être qu'on pourrait en avoir un40k,Pas préparé, juste30k+,Tu sais ce que c'est?)

Comment préparer une entrevue?

1、Pré - pavage(Dépôt technique)

.L'entrevue avec le programmeur est en fait un test exploratoire pour la technologie,Ta technique.,Alors tu es le grand - père..Les exigences techniques des grandes usines se reflètent principalement dans:Base,Principes,Étude approfondie du code source,Ampleur,Cinq aspects du combat réel,Et ce n'est qu'en combinant la théorie des principes avec la pratique que nous pourrons obtenir des points techniques.

Voici quelques notes d'information que je vais lire,J'espère pouvoir vous aider à aller de l'avant,Apprentissage du point à la faceJava,L'âme de l'intervieweur de Dachang

C'est trop.,Le petit rédacteur en chef n'a affiché qu'une partie du contenu pour vous montrer,Merci. Merci.!

  • JavaLes programmeurs doivent regarder《JavaDévelopper des notes de base(Version Huashan)》

Java Multithreading —— Questions relatives aux producteurs et aux consommateurs,De la base au cas profond_Interview

  • RedisNotes d'étude

Java Multithreading —— Questions relatives aux producteurs et aux consommateurs,De la base au cas profond_Développement de l'arrière - plan_02

  • JavaNotes d'apprentissage sur la programmation simultanée

Quatre Parties,Programmation simultanée détaillée fractionnée——Programmation simultanée+Chapitre modal+Application+Principes

Java Multithreading —— Questions relatives aux producteurs et aux consommateurs,De la base au cas profond_Interview_03

  • JavaLes programmeurs doivent lire des livres《Compréhension approfondie avaMachine virtuelle3Édition》(pdfÉdition)

Java Multithreading —— Questions relatives aux producteurs et aux consommateurs,De la base au cas profond_Java_04

  • L'entretien d'usine doit être demandé——Structure des données et algorithme de compilation des notes

Java Multithreading —— Questions relatives aux producteurs et aux consommateurs,De la base au cas profond_Interview_05

AutresSpring,SpringBoot,SpringCloud,SpringCloudAlibaba,Dubbo,Zookeeper,Kafka,RocketMQ,RabbitMQ,Netty,MySQL,Docker,K8sAttends, je vais tout arranger.,Il n'y a pas un par un ici.

Java Multithreading —— Questions relatives aux producteurs et aux consommateurs,De la base au cas profond_Java_06

2、Questions d'entrevue

La technologie est principalement incarnée dans l'accumulation quotidienne pratique,Préparez - vous à passer en revue deux mois avant l'entrevue,Ensuite, les questions d'entrevue,Les questions d'entrevue ci - dessous ont été soigneusement compilées,Postez - le à tout le monde..

①Grande fréquence de la centrale45Questions d'examen Dao Pen(Questions de Qi)

Java Multithreading —— Questions relatives aux producteurs et aux consommateurs,De la base au cas profond_Java_07

②BATRésumé de l'entrevue en usine(Capture d'écran partielle)

Java Multithreading —— Questions relatives aux producteurs et aux consommateurs,De la base au cas profond_Développement de l'arrière - plan_08

Java Multithreading —— Questions relatives aux producteurs et aux consommateurs,De la base au cas profond_Développement de l'arrière - plan_09

③Résumé de l'entrevue

Java Multithreading —— Questions relatives aux producteurs et aux consommateurs,De la base au cas profond_Interview_10

Java Multithreading —— Questions relatives aux producteurs et aux consommateurs,De la base au cas profond_Développement de l'arrière - plan_11

3、Combiné à la réalité,Modifier le CV

Le curriculum vitae du programmeur doit être un peu plus dur,Surtout quand il s'agit de quelques mots,Par exemple:“Maîtrise、Familiarisation、Compris.”La distinction entre les trois doit être claire,Sinon, je me creuse un trou.Bien sûr que non.,Je peux vous donner mon CV pour référence,Si ce n'est pas assez,Voici quelques modèles de CV que vous pouvez choisir:

Java Multithreading —— Questions relatives aux producteurs et aux consommateurs,De la base au cas profond_Java_12

Partage ci - dessus,J'espère que tout le monde pourra trouver un bon travail pendant la saison de l'or, de l'argent et du saut d'emploi,Mais n'oubliez pas,La technique doit être l'accumulation de travail habituel ou l'auto - étude(Ou suivre le professeur.)Cumulatif sur le terrain,Ne froncez jamais les pieds.

En plus,Essayez de parler de vos propres idées si vous rencontrez des problèmes non résolus lors d'une entrevue.,Parce qu'il y a des problèmes qui ne sont pas d'examiner nos capacités de programmation,C'est la capacité d'expression de la pensée logique.;Enfin, l'auto - analyse et l'évaluation doivent être effectuées en temps normal.,Planification de carrière,Continue à tâter.,Améliorer ses capacités de programmation et de pensée abstraite.

Cet article a été publié par CODINGProjet Open Source:【Grandes usines de première ligneJavaAnalyse des questions d'entrevue+Résumé de base notes d'étude+Dernière vidéo d'explication+Code source du projet opérationnel】Inclus

版权声明
本文为[Harmonios Learning]所创,转载请带上原文链接,感谢
https://javamana.com/2021/11/20211125185549198u.html

  1. jQuery-实例方法
  2. jQuery-dom和jQuery,入口函数(基本知识)
  3. JavaScript-this指向问题
  4. JavaScript-封装与继承(两种)
  5. JavaScript-包装类型
  6. JavaScript-传值(引用类型,基本类型)
  7. JavaScript-面向对象(构造函数,实例成员,静态成员)
  8. JavaScript-解构赋值
  9. JavaScript-箭头函数
  10. JavaScript-参数
  11. JavaScript-预解析(变量提升)
  12. JavaScript-闭包closure
  13. JavaScript-声明变量的关键字
  14. JavaScript - mot - clé pour déclarer une variable
  15. Fermeture de fermeture JavaScript
  16. JavaScript Pre - parse (promotion des variables)
  17. Paramètres JavaScript
  18. Fonction de flèche JavaScript
  19. JavaScript - déconstruction assignations
  20. Common annotations in springboot
  21. Building CentOS 7.6 with Linux
  22. JavaScript - orienté objet (constructeur, membre d'instance, membre statique)
  23. JavaScript value Transfer (reference type, Basic type)
  24. JavaScript - type d'emballage
  25. linux deepin/ubuntu安装flameshot火焰截图
  26. JavaScript - encapsulation et héritage (deux)
  27. JavaScript JS method for writing 99 multiplication table
  28. 從零開始學java - 第二十五天
  29. Apprendre Java à partir de zéro - jour 25
  30. Les voitures d'hiver, les voitures électriques et les voitures à essence ne sont pas les mêmes?
  31. JavaScript - ceci pointe vers le problème
  32. Copie JavaScript
  33. Spring boot quickly integrates swagger
  34. linux deepin/ubuntu安裝flameshot火焰截圖
  35. Capture d'écran de flamme de l'installateur de flamme Linux deepin / Ubuntu
  36. Jquery DOM et jquery, fonctions d'entrée (bases)
  37. Méthode d'instance jquery
  38. Méthode et démonstration de code dans l'interface de liste en Java
  39. 【错误记录】Java 中 ArrayList 排序 ( 使用 Comparator 接口时注意 compare 返回值是 -1 和 +1 )
  40. Démarrage du Zookeeper
  41. Java oom Cognition
  42. Java 开发者最困惑的四件事,值得一看!,BAT面试文档
  43. Java 将两个对象list里面的 某个字段值抽取到一个list里,java选择排序原理
  44. Java 多线程 —— 生产者消费者问题,从基础到深入案例
  45. Java 中设计模式 之 工厂模式,java反射机制的底层原理
  46. 【錯誤記錄】Java 中 ArrayList 排序 ( 使用 Comparator 接口時注意 compare 返回值是 -1 和 +1 )
  47. 【 enregistrement des erreurs 】 tri ArrayList en Java (Notez que les valeurs de retour de comparaison sont - 1 et + 1 lors de l'utilisation de l'interface de comparaison)
  48. Pourquoi Xiaopeng P5 est - il devenu un grand succès dans le cercle? Le Salon de l'automobile de Guangzhou montre encore des compétences polyvalentes
  49. Java 開發者最困惑的四件事,值得一看!,BAT面試文檔
  50. Les quatre choses les plus déroutantes pour les développeurs Java valent la peine d'être regardées! Document d'entrevue sur les MTD
  51. k8s-Pod污点与容忍
  52. k8s-Pod污点与容忍
  53. K8s POD Contamination and Tolerance
  54. K8s POD Contamination and Tolerance
  55. mysql常用语句——GROUP BY和HAVING
  56. Spring boot quickly integrates swagger
  57. mysql常用語句——GROUP BY和HAVING
  58. MySQL Common statements - group by and having
  59. Le défi du pinceau leetcode - Javascript: 110. Arbre binaire équilibré
  60. [notes d'apprentissage de première ligne] day44: XMLHttpRequest