Java多线程-三个线程循环打印ABC(二)

2017/05/04 Java,多线程

Java三个线程循环打印ABC。。。,是个笔试题,主要学习掌握线程同步,需要有线程基础知识。
思路:通过synchronized关键词锁定两个对象保持线程同步,只有同时获取上一个对象和自身锁才运行来保证依次打印ABC,当前线程运行完使用wait释放自身锁并使用modify唤醒上一个对象锁。
A->AC,B->BA,C-CA锁关系,A同时满足获取AC锁执行打印后处理线程状态wait->A并notify->C,B满足AB锁才会运行所以只有当A运行完并wait释放B才会运行再依次wait->B并notify->A,C也是依次执行。

定义一个线程执行主体

/**
 * Created by litf on 2017/5/4.
 */
public class RunnableAbcTwo implements Runnable{

    private Object prev;
    private Object self;

    private String name;

    private int sum= 0;

    public RunnableAbcTwo(Object self,Object prev,String name){
        this.prev = prev;
        this.name = name;
        this.self = self;
    }
    @Override
    public void run() {
        while(true){
           // System.out.println("wh--"+name);

            synchronized (self){
                //System.out.println("prev--"+name);

                synchronized (prev){
                    System.out.println(name);
                    prev.notify();
                    //System.out.println("wait--"+name);
                }
                try {
                    self.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            sum++;
            if(sum >=10){
             break;
            }
        }

    }
}

调用打印ABC

/**
 * Created by litf on 2017/5/4.
 */
public class RunableTestTwo {
    public static void main(String args[])throws Exception{

        Object A = new Object();
        Object B = new Object();
        Object C = new Object();
        Thread t1 = new Thread (new RunnableAbcTwo(A, B, "A"));

        Thread t2 = new Thread (new RunnableAbcTwo(B, C, "B"));

        Thread t3 = new Thread (new RunnableAbcTwo(C, A, "C"));

        t1.start();
        t2.start();
        t3.start();
    }
}
打印结果:
```java
A
B
C
A
B
C
A
B
C
A
B
C
A
B
C
A
B
C
A
B
C
A
B
C
A
B
C
A
B
C
Show Disqus Comments

Search

    Post Directory