zoukankan      html  css  js  c++  java
  • 009 wait notify等方法

    一 .概述

      当我们实现了原子性操作的时候,我们又会遇到一个问题,那就是线程之间通信的问题.所谓的线程通信,指的就是线程间的执行顺序是需要进行一定的控制的.

      我们拿最经典的生产者和消费者模型进行说明:

    private static Object lock = new Object();
        private static int index = 1;
        private static volatile Boolean flag = true;
    
        /**
         * 生产者的线程
         */
        static class Provider {
    
            public static void proIndex() {
                synchronized (lock) {
                    if (!flag) {
                        System.out.println(Thread.currentThread().getName() + "--" + index++);
                        lock.notify();
                        flag = !flag;
                    } else {
                        try {
                            lock.wait();
                        } catch (InterruptedException e1) {
                            e1.printStackTrace();
                        }
                    }
    
                }
            }
        }
    
        /**
         * 消费者的线程
         */
        static class Consumer {
    
            public static void conIndex() {
                synchronized (lock) {
                    if (flag) {
                        System.out.println(Thread.currentThread().getName() + "--" + index);
                        lock.notify();
                        flag = !flag;
                    } else {
                        try {
                            lock.wait();
                        } catch (InterruptedException e1) {
                            e1.printStackTrace();
                        }
                    }
                }
            }
        }
    
        public static void main(String[] args) throws InterruptedException {
    
            new Thread(() -> {
                while (true) {
                    sleep();    
                    Provider.proIndex();
                }
            }).start();
            new Thread(() -> {
                while (true) {
                    sleep();
                    Consumer.conIndex();
                }
            }).start();
        }
        
        private static void sleep() {
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    在这里,我们使用wait()和notify()方法进行实现.

      但是我们发现了一个问题,如果我们实现线程之间的通讯的代价实在是太高了.

    于是在并发包之中为我们提供了一系列的线程通讯的工具,这些都会在后面进行分析.

  • 相关阅读:
    CCPC长春赛重现
    2016弱校联盟十一专场10.3,BNU52308,大模拟
    2016弱校联盟十一专场10.3,BNU52308,大模拟
    UVA12264 二分最大流,注意pdf的样例是错的
    UVA12264 二分最大流,注意pdf的样例是错的
    UVA1658海军上将,拆点费用流
    UVA1658海军上将,拆点费用流
    angular报错:Please add a @Pipe/@Directive/@Component annotation
    angular 自定义验证器
    ionic 学习笔记
  • 原文地址:https://www.cnblogs.com/trekxu/p/9517010.html
Copyright © 2011-2022 走看看