Java实现多线程经典问题:使用三个线程实现输出ABCABC循环

使用三个线程实现ABCABC……循环。
代码如下:

//标记类,用来让三个线程共享,同时也是三个线程中同步代码快的标记对象。
//之前这个标记我设置成Integer,但是发现Integer进行加法运算时会改变对
//象引用(原因是自动装箱),因此出现异常抛出。所以索性自己定义Flag类。
class Flag{
    int i=0;
    public synchronized void  setI()
    {
        i++;
        if(i==3)
            i=0;
    }

}
//输出A的线程
class SafeTestA implements Runnable{
    int num=10;
    Flag flag;
    public SafeTestA(Flag flag)
    {
        this.flag=flag;
    }
    public void run()
    {
        synchronized(flag){
            while(true)
            {
                if(flag.i==0){
                    System.out.println("A");
                    flag.setI();
                    flag.notifyAll();
                }else{
                    try {
                        flag.wait();
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        }

    }
    /*public static void main(String[] args) {
        Runnable sf=new SafeTest();
        new Thread(sf).start();
        new Thread(sf).start();
        new Thread(sf).start();
    }*/
}
//输出B的线程:
class SafeTestB implements Runnable{
    Flag flag;
    public SafeTestB(Flag flag)
    {
        this.flag=flag;
    }
    public void run()
    {
        while(true)
        {
            synchronized(flag){
                while(true)
                {
                    if(flag.i==1){
                        System.out.println("B");
                        flag.setI();
                        flag.notifyAll();
                    }else{
                        try {
                            flag.wait();
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
    }

}

//输出C的线程
public class SafeTestC implements Runnable{
    Flag flag;
    public SafeTestC(Flag flag)
    {
        this.flag=flag;
    }
    public void run()
    {
        synchronized(flag){
            while(true)
            {
                if(flag.i==2){
                    System.out.println("C");
                    flag.setI();
                    flag.notifyAll();
                }else{
                    try {
                        flag.wait();
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        }
    }

    public static void main(String[] args) {
        Flag flag=new Flag();
        new Thread(new SafeTestA(flag)).start();
        new Thread(new SafeTestB(flag)).start();
        new Thread(new SafeTestC(flag)).start();

    }
}
最关键的问题在于三个线程间的通信问题,是通过flag对象来标记的,之前出错是因为使用Integer来作为标记。这个例子也很好的给出了同步代码块的使用方法。
我的这个代码有累赘的部分,三个线程类其实可以用一个来实现更简洁。

你可能感兴趣的:(Java基础)