Les articles de blog précédents ont essentiellement résumé un contenu en concurrence en Java. Cet article de blog commence principalement par un problème et voir quelles technologies de concurrence résumées ci-dessus peuvent être utilisées pour les résoudre.
Simuler un scénario: Traitement 16 enregistrements de journal, chaque temps d'impression des enregistrements de journal prend 1 seconde. Dans des circonstances normales, si ces 16 records sont terminés, cela prend 16 secondes. Afin d'améliorer l'efficacité, nous sommes prêts à démarrer 4 threads à imprimer et à les imprimer en 4 secondes pour réaliser cette démo.
Analysons d'abord cette question. En ce qui concerne ces 16 enregistrements de journal, nous pouvons les générer dans le fil principal. Ce n'est pas difficile. La clé consiste à démarrer 4 threads à exécuter. Il y a maintenant deux idées: la première est que la génération de journaux et le fil qui imprime les journaux sont logiquement séparés; L'autre est que la génération de journaux et le thread qui impriment les journaux ne sont logiquement pas séparés. Cela peut être un peu obscur. Permettez-moi d'écrire une démo implémentée en fonction de ces deux idées.
La génération de journaux et l'impression logarithmique sont logiquement séparés.
Cela équivaut à deux fronts: un front génère constamment des journaux, et l'autre front est en constante imprimerie. Il est évident que vous pensez à l'utilisation de files d'attente de blocage et à générer des journaux qui continuent de se brancher dans les files d'attente de blocage et des journaux d'impression qui continuent de passer des files d'attente de blocage. La taille de la file d'attente de blocage peut être définie par vous-même, 16 ou 1, ce qui n'affecte pas l'exécution. Donc BlockingQueue sera utilisé, jetons un coup d'œil à la démo implémentée ci-dessous:
classe publique Practice1 {public static void main (String [] args) {// définir une file d'attente de blocage, la taille de file d'attente peut contenir 16 informations BlockingQueue <string> file d'attente = new ArrayBlockingQueue <string> (16); for (int i = 0; i <4; i ++) {// ouvrir quatre threads pour bloquer la fiducie pour obtenir le nouveau thread imprimable (nouveau Runnable () {@Override {while (true) {try {string log = queue.take (); // get log parselog (log); // imprimer log} catch (interruptedException e) {// todo-généré par auto-généré blocke.printStackTrace ();}}}}). start ();} system.out.println ("begin:" + "+" + (System.CurrentTimemillis () / 1000)); for (int i = 0; i <16; i ++) {final String log = "" + (i + 1); // indique un journal try {queue.put (log); // subt la connex Blocke.printStackTrace ();}}} public static void Parselog (String Log) {// Méthode pour l'impression du journal System.out.println (thread.currentThread (). GetName () + "---" + Log + "---" + (System.currenttimeMillis () / 1000)); Try {Thread.Sleep (1000); 1 seconde} catch (InterruptedException e) {// TODO GÉNÉRÉ AUTO-GÉNÉRÉ BLOCKE.PRINTSTACKTRACE ();}}}} C'est comme si un système fonctionne, générant constamment des journaux et ouvrant en continu plusieurs threads pour imprimer des informations de journal. La démo est écrite et le résultat de l'opération n'est pas affiché.
La génération de journaux et l'impression logarithmique ne sont pas logiquement séparés.
Cette idée est que lorsque je génère le journal, vous l'imprimez pour moi et le faites avec quatre fils ensemble! Donc, si vous pensez de cette façon, vous devez utiliser le pool de fils. J'ai d'abord créé un pool de threads, qui contenait 4 threads, puis lorsque le journal a été généré, j'ai demandé au pool de threads d'utiliser le thread pour l'exécuter. La démo est la suivante:
classe publique Practice1 {public static void main (String [] args) {ExecutorService Service = Exécutor Service.execute (new Runnable () {// Prenez un thread pour exécuter @Override public void run () {Parselog (log);}});} Service.shutdown (); // N'oubliez pas de désactiver le thread Pool à la fin} public static void Parselog (String Log) {system.out.println (thread.curnthredThread (). "---" + (System.Currenttimemillis () / 1000)); try {Thread.Sleep (1000); // Simuler l'impression d'un journal prend 1 seconde} Catch (InterruptedException E) {// TODO Generated Catch Blocke.printStackTrace ();}}}}Résumons ce problème ici. Si vous comprenez ces deux idées, vous pouvez généralement les résoudre efficacement.
Ce qui précède est l'intégralité du contenu de cet article sur Java Programmation d'un exemple de problème de problème multithread, j'espère que cela sera utile à tout le monde. Les amis intéressés peuvent continuer à se référer à d'autres sujets connexes sur ce site. S'il y a des lacunes, veuillez laisser un message pour le signaler. Merci vos amis pour votre soutien pour ce site!