zoukankan      html  css  js  c++  java
  • Java通过wait()和notifyAll()方法实现线程间的通信

    Java代码(使用了2个内部类):

    复制代码
    package Threads;
    
    import java.util.LinkedList;
    
    /**
     * Created by Frank
     */
    public class ProdCons {
        protected LinkedList<Object> list = new LinkedList<>();
        protected int max;
        protected boolean done = false;
    
        public static void main(String[] args) throws InterruptedException {
            ProdCons prodCons = new ProdCons(100, 3, 4);
            Thread.sleep(5 * 1000);
            synchronized (prodCons.list) {
                prodCons.done = true;
                try {
                    prodCons.notifyAll();
                } catch (Exception ex) {
                }
            }
        }
    
        private ProdCons(int maxThreads, int nP, int nC) {
            this.max = maxThreads;
            for (int i = 0; i < nP; i++) {
                new Producer().start();
            }
            for (int i = 0; i < nC; i++) {
                new Consumer().start();
            }
        }
    
        class Producer extends Thread {
            public void run() {
                while (true) {
                    Object justProduced = null;
                    try {
                        justProduced = getObj();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized (list) {
                        while (list.size() == max) {
                            try {
                                list.wait();
                            } catch (InterruptedException e) {
                                System.out.println("Producer INTERRUPTED");
                            }
                        }
                        list.addFirst(justProduced);
                        list.notifyAll();
                        System.out.println("Produced 1;List size now " + list.size());
                        if (done) {
                            break;
                        }
                    }
                }
            }
        }
    
        class Consumer extends Thread {
            public void run() {
                while (true) {
                    Object object = null;
                    synchronized (list) {
                        if (list.size() == 0) {
                            try {
                                list.wait();
                            } catch (InterruptedException e) {
                                System.out.println("Consumer INTERRUPTED");
                            }
                        }
                        if (list.size() > 0) {
                            object = list.removeLast();
                        }
                        list.notifyAll();
                        System.out.println("List size now " + list.size());
                        if (done) {
                            break;
                        }
                    }
                    if (null != object) {
                        System.out.println("Consuming object " + object);
                    }
                }
            }
        }
    
        private Object getObj() throws InterruptedException {
            Thread.sleep(1000);
            return new Object();
        }
    }
    复制代码
  • 相关阅读:
    .NET基础之:i++和i=i+1和++i的区别
    几个缩写
    下一步工作的一些思考和问题
    显著提高应变的定位精度和颗粒大小
    两个使用的Ajax Demo
    SQL Service查询分析
    自学面向对象
    支持定位当前页,自定义排序的分页SQL(拒绝动态SQL)
    WCF学习经验分享,如何更好地学习WCF?
    Custom DataContractSerializerOperationBehavior
  • 原文地址:https://www.cnblogs.com/chinaifae/p/10238496.html
Copyright © 2011-2022 走看看