• 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();
        }
    }
  • 相关阅读:
    语言相关
    一道简单DP题
    一道概率题
    Android CrashHandler
    一道简单数学题
    面试中遇到的随机题目
    VMWare 无损扩展磁盘大小
    Android 源码编译记录
    Android handler 内存泄露分析及解决方法
    Android 反编译
  • 原文地址:https://www.cnblogs.com/frankyou/p/6524193.html
Copyright © 2020-2023  润新知