zoukankan      html  css  js  c++  java
  • 010 线程通信

    一 . 概念

      我们使用多个线程的时候,我们需要线程运行之间按照一定的顺序运行下去,这个就需要线程之间的通信.


    二 .例子

      我们使用经典的生产者和消费者模式演示一下.

    public class ProductAndConsume {
        private static Object lock = new Object();
        private volatile static int count = 0;
        private static volatile boolean flag = false;
    
        public static void product()  {
                synchronized (lock) {
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e1) {
                        e1.printStackTrace();
                    }
                    if (!flag) {
                        System.out.println("我生产了第" + (++count) + "个产品");
                        try {
                            //放入等待池中
                            flag = true ; 
                            lock.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
        }
    
        public static void consume() {
                synchronized (lock) {
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e1) {
                        e1.printStackTrace();
                    }
                    if (flag) { // 有产品
                        System.out.println("我消费了第" + count + "个产品");
                        flag = false;
                        lock.notify(); 
                    } 
                }
        }
    
        public static void main(String[] args) {
            new Thread("product") {
                @Override
                public void run() {
                    for(;;)
                    product();
                };
            }.start();
    
            new Thread("consume") {
                @Override
                public void run() {
                    for(;;)
                    consume();
                };
            }.start();
        }
    }

    我们创建了两个线程,一个生产产品,另外一个线程消费产品.

    我们使用了wait()方法和notify()方法发送信号量,实现线程之间的同步.


    三 .分析

    [1]首先需要说明的就是我们的wait和notify都需要在同步代码块(同步方法之中运行).

    [2]wait()方法的含义是:

        放弃当前持有的锁,,进入到锁池中,等待被唤醒.

    [3]notify()方法的含义是:

        在当前的锁池中唤醒一个线程.

  • 相关阅读:
    php数组转json 中文编码错乱解决
    fastadmin展示多个视频按钮
    fastadmin在json字段动态关联
    fastadmin放大镜改为“搜索”
    fastadmin行内手机验证规则
    fastadmin批量修改状态
    php手机、邮箱规则验证
    tp5 查询某个值是否在数据表某一个字段中 FIND_IN_SET
    css书写规范以及如何写出赏心悦目的代码
    html5中常见选择器
  • 原文地址:https://www.cnblogs.com/trekxu/p/8971288.html
Copyright © 2011-2022 走看看