zoukankan      html  css  js  c++  java
  • java 线程间的通信 (wait / notify / notifyAll)

    package waitnotifytest;
    
    import java.util.Collections;
    import java.util.List;
    import com.google.common.collect.Lists;
    
    /**
     * Test
     */
    public class Test {
    
        private static final Class<Test> lockObj = Test.class;
    
        private final List<String> list = Collections.synchronizedList(Lists.newArrayListWithCapacity(10));
    
        public static void main(String[] args) {
            Test test = new Test();
            test.test();
        }
    
        private void push() {
            while (list.size() >= 10) {
                System.out.println("厨师:" + Thread.currentThread().getName() + " 等待中...");
                try {
                    synchronized (lockObj) {
                        lockObj.wait();
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            list.add("item");
            list.add("item");
            list.add("item");
            list.add("item");
            list.add("item");
            System.out.println("出菜台的菜品数量" + list.size());
            synchronized (lockObj) {
                System.out.println("厨师通知所有人");
                lockObj.notifyAll();
            }
        }
    
        private void popup() {
            synchronized (lockObj) {
                while (list.isEmpty()) {
                    try {
                        System.out.println("服务员:" + Thread.currentThread().getName() + "等待中...");
                        lockObj.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                list.remove(list.size() - 1);
            }
            System.out.println("出菜口的菜品数量为:" + list.size());
            synchronized (lockObj) {
                lockObj.notifyAll();
            }
            System.out.println("服务员通知所有人...");
        }
    
        public void test() {
            Runnable runnable = new Runnable() {
                @Override
                public void run() {
                    while (true) {
                        push();
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            };
    
            Runnable runnable2 = new Runnable() {
                @Override
                public void run() {
                    while (true) {
                        popup();
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            };
    
            for (int i = 0; i < 2; i++) {
                Thread thread = new Thread(runnable);
                thread.start();
    
            }
            for (int i = 0; i < 10; i++) {
                Thread thread = new Thread(runnable2);
                thread.start();
            }
    
        }
    }
  • 相关阅读:
    Codeforces 451A Game With Sticks
    POJ 3624 Charm Bracelet
    POJ 2127 Greatest Common Increasing Subsequence
    POJ 1458 Common Subsequence
    HDU 1087 Super Jumping! Jumping! Jumping!
    HDU 1698
    HDU 1754
    POJ 1724
    POJ 1201
    CSUOJ 1256
  • 原文地址:https://www.cnblogs.com/frankyou/p/10729564.html
Copyright © 2011-2022 走看看