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

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

原文地址:https://www.cnblogs.com/trekxu/p/8971288.html