利用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();


    }


}

猜你喜欢

转载自blog.csdn.net/WalleIT/article/details/88410129
今日推荐