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();
        }
    }
  • 相关阅读:
    oracle热备份与冷备份的对比
    oracle数据库备份
    shell 去除空行
    已有实例 Oracle 下新增实例(2)通过dbca克隆实例
    oracle启动,提示“LRM-00109: could not open parameter file”
    linux——使用fidsk对linux硬盘进行操作【转】
    前端——知识点
    hdu 3996 Gold Mine 最大权闭合子图
    hdu 3917 Road constructions 最大权闭合子图
    poj 2987 Firing 最大权闭合子图
  • 原文地址:https://www.cnblogs.com/frankyou/p/6524193.html
Copyright © 2011-2022 走看看