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

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

  • 相关阅读:
    第三课 Spinner的使用
    Deployment failed due to an error in FastDev assembly synchronization.
    第二课 两个视图+数据传输
    第一课 Hello
    Tab的键的妙用
    RelativeLayout相对布局中拖放控件的办法
    更改layout的布局
    关于MultiDataTrigger和MultiTrigger的一些注意事项
    WPF中XAML的触发器的属性,事件 都有那些?以及如何寻找
    EventTrigger
  • 原文地址:https://www.cnblogs.com/trekxu/p/8971288.html
Copyright © 2011-2022 走看看