美文网首页
多线程循环打印ABC

多线程循环打印ABC

作者: liuzhimi | 来源:发表于2018-03-13 19:44 被阅读0次

    代码部分

    Print.java

    public class Print {

        private int flag = 1;

        synchronized public void printA(){

            if(flag == 1){

                System.out.print("A");

                flag = 2;

                try {

                    this.notifyAll();

                } catch (Exception e) {

                    e.printStackTrace();

                }

            }else{

                try {

                    this.wait();

                } catch (Exception e) {

                    e.printStackTrace();

                }

            }

        }

        synchronized public void printB(){

            if(flag == 2){

                System.out.print("B");

                flag = 3;

                try {

                    this.notifyAll();

                } catch (Exception e) {

                    e.printStackTrace();

                }

            }else{

                try {

                    this.wait();

                } catch (Exception e) {

                    e.printStackTrace();

                }

            }

        }

        synchronized public void printC(){

            if(flag == 3){

                System.out.print("C");

                flag = 1;

                try {

                    this.notifyAll();

                } catch (Exception e) {

                    e.printStackTrace();

                }

            }else{

                try {

                    this.wait();

                } catch (Exception e) {

                    e.printStackTrace();

                }

            }

        }

    }

    Main.java

    public class Main {

        static Print print = new Print();

        public static void main(String[] args) {

            new Thread(new Runnable() {

                @Override

                public void run() {

                    for(int i = 0; i < 10; i++){

                        print.printA();

                        try {

                            Thread.sleep(1000);

                            System.out.println();

                        } catch (Exception e) {

                            e.printStackTrace();

                        };

                    }

                }

            }).start();

            new Thread(new Runnable() {

                @Override

                public void run() {

                    while(true){

                        print.printB();

                    }

                }

            }).start();

            new Thread(new Runnable() {

                @Override

                public void run() {

                    while(true){

                        print.printC();

                    }

                }

            }).start();

        }

    }

    运行结果

    分析

    Print类中有三个synchronized的方法,每次仅有一个线程能够使用其中任一方法。

    同时通过flag来判断是否打印该字母,实现ABC的顺序打印。

    在Main类中,新开三个线程分别循环打印A、B、C。B、C线程当且仅当flag符合要求时才会打印输出并且唤醒所有线程产生线程竞争,否则将会执行线程等待。

    在第一个new Thread中为了防止每次循环回来时flag还未重置为1,因此Thread.sleep(1000)确保执行下次循环式flag已重置为1.

    相关文章

      网友评论

          本文标题:多线程循环打印ABC

          本文链接:https://www.haomeiwen.com/subject/sgftqftx.html