Une question d'entrevue classique: deux fils, respectivement imprimer AB, parmi lesquels le fil A imprime, le fil B imprime B, imprime 10 fois chacun, de sorte que l'effet d'Abebaba ...
package com.shangshe.path; classe publique Threadab {/ ** * @param args * / public static void main (String [] args) {final print business = new print (); nouveau thread (new Runnable () {public void run () {for (int i = 0; i <10; i ++) {business.print_a ();}}}). start (); nouveau thread (new Runnable () {public void run () {for (int i = 0; i <10; i ++) {business.print_b ();}}}). start (); }} class print {private boolean drape = true; public synchronisé void print_a () {while (! Flag) {try {this.wait (); } Catch (InterruptedException e) {// TODO Block de catch généré automatiquement e.printStackTrace (); }} System.out.print ("A"); Flag = false; this.notify (); } public synchronisé void print_b () {while (flag) {try {this.wait (); } Catch (InterruptedException e) {// TODO Block de catch généré automatiquement e.printStackTrace (); }} System.out.print ("B"); Flag = true; this.notify (); }}À partir de l'exemple ci-dessus, nous pouvons concevoir un programme avec 3 threads ou même N threads. L'exemple donné ci-dessous est 3 threads, respectivement, A, B et C sont imprimés 10 fois, de sorte que l'effet d'ABCABC ..
classe publique threadabc {/ ** * @param args * / public static void main (String [] args) {final print business = new print (); nouveau thread (new Runnable () {public void run () {for (int i = 0; i <100; i ++) {business.print_a ();}}}). start (); nouveau thread (new Runnable () {public void run () {for (int i = 0; i <100; i ++) {business.print_b ();}}}). start (); nouveau thread (new Runnable () {public void run () {for (int i = 0; i <100; i ++) {business.print_c ();}}}). start (); }} class print {private booléan devrait_a = true; booléen privé devrait_b = false; booléen privé devrait_c = false; public synchronisé void print_a () {while (devrait_b || devrait_c) {try {this.wait (); } Catch (InterruptedException e) {// TODO Block de catch généré automatiquement e.printStackTrace (); }} System.out.print ("A"); devrait_a = false; devrait_b = true; devrait_c = false; this.notifyall (); } public synchronisé void print_b () {while (devrait_a || devraient_c) {try {this.wait (); } Catch (InterruptedException e) {// TODO Block de catch généré automatiquement e.printStackTrace (); }} System.out.print ("B"); devrait_a = false; devrait_b = false; devrait_c = true; this.notifyall (); } public synchronisé void print_c () {while (devrait_a || devait_b) {try {this.wait (); } Catch (InterruptedException e) {// TODO Block de catch généré automatiquement e.printStackTrace (); }} System.out.print ("C"); devrait_a = true; devrait_b = false; devrait_c = false; this.notifyall (); }}Encore une fois, l'importance de l'ingénierie logicielle est prouvée; Dans les programmes multi-thread, il convient de dire que dans les programmes, nous devons mettre le code de la logique métier dans la même classe pour le rendre très cohérent et à faible couplage