java 线程间的通信 (wait / notify / notifyAll)

时间:2019-04-18
本文章向大家介绍java 线程间的通信 (wait / notify / notifyAll),主要包括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();
        }

    }
}