利用wait()和notify()方法實現多線程的“有序”執行

例題描述:建立三個線程,A線程打印100次A,B線程打印100次B,C線程打印100次C,要求線程同時運行,交替打印100次ABC。這個問題用Object的wait(),notify()就可以很方便的解決。

public class HelloJava{

    static class OrderedThread implements Runnable{

        private Object next;
        private Object current;
        private String printStr;

        OrderedThread(Object current, Object next, String str){
            this.printStr = str;
            this.next = next;
            this.current = current;
        }

        @Override
        public void run() {
            for (int i=0;i<100;i++){
                // 總體思路:1.在一輪完成之前,阻塞自己進入下一輪循環;2.在當前打印完成之前,先獲取下一個打印線程的鎖
                synchronized (current){
                    // 當前線程先持有下一個打印線程需要的鎖,先阻塞下一個線程工作
                    synchronized (next){
                        if (Thread.currentThread().getName().equals("AAA--")) System.out.println();
                        System.out.println(Thread.currentThread().getName() + ": " + printStr);
                        // 在當前線程打印完之後,才釋放下一個線程的鎖,以保證次序
                        // 假設是A-D四個線程循環,當D打印完成後,通知A進而第二輪循環
                        // A線程在第二輪打印完成後,觸發第一輪的B線程執行wait()後面的操作,也就是B也開始進入第二輪
                        next.notify();
                    }
                    // 執行到此處,就釋放了next的鎖,next是下一個線程需要的鎖,即此時觸發下一個線程工作
                    try {
                        // 當前線程打印完,就先阻塞起來,等待一輪打印完成後,才進而二輪循環
                        // 第一輪裏面,A線程一直阻塞,直到最後被D線程notify,因爲D的next是A的current wait的鎖
                        current.wait();
                        System.out.println(Thread.currentThread().getName() + " end.........");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                }
            }
            synchronized (next){
                next.notify();
                System.out.println(Thread.currentThread().getName()+"執行完畢" + next);
            }

        }
    }

    public static void main(String[] args) throws InterruptedException {
        new Thread(new OrderedThread("A", "B", "aaa"), "AAA--").start();
        Thread.sleep(100);
        new Thread(new OrderedThread("B", "C", "bbb"), "BBB--").start();
        Thread.sleep(100);
        new Thread(new OrderedThread("C", "D", "ccc"), "CCC--").start();
        Thread.sleep(100);
        new Thread(new OrderedThread("D", "A", "ddd"), "DDD--").start();


    }


}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章