• 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()方法进行实现.

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

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

  • 相关阅读:
    优化MySchool数据库(存储过程)
    优化MySchool数据库(事务、视图、索引)
    优化MySchool数据库(四)
    优化MySchool数据库(三)
    SQLAchemy
    python操作mysql
    python队列
    零碎知识
    super深究
    Python操作RabbitMQ
  • 原文地址:https://www.cnblogs.com/trekxu/p/9517010.html
Copyright © 2020-2023  润新知