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()方法的含义是:

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

  • 相关阅读:
    IE8上传插件jquery-form.js上传请求参数设置type为post失效问题
    路径参数汉字兼容问题
    vue-cli2移动端适配
    事件委托原生、jQuery实现
    new Date()在移动端的问题
    create-react-app配置less
    删除左右两边空格
    日期转换
    Git 常用命令
    单页面应用
  • 原文地址:https://www.cnblogs.com/trekxu/p/8971288.html
Copyright © 2011-2022 走看看