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

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

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

  • 相关阅读:
    windows下的mysql备份恢复命令
    sp_addlinkedserver的使用方法 (转)
    一个以pubs数据库为例的SQL SERVER数据库全文索引
    【C#】可空类型(Nullable)
    【C#】 异常处理
    【电脑常识】如何查看电脑是32位(X86)还是64位(X64),如何知道硬件是否支持64位系统
    【C#】委托Delegate
    【工具】VS2010常用调试技巧(1)
    实验1 总结
    用C语言编程自动生成四则运算
  • 原文地址:https://www.cnblogs.com/trekxu/p/9517010.html
Copyright © 2011-2022 走看看