码迷,mamicode.com
首页 > 编程语言 > 详细

010 线程通信

时间:2018-04-29 16:56:45      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:sleep   放弃   class   over   生产者和消费者   同步代码块   nts   sum   out   

一 . 概念

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


 

二 .例子

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

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

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

 

010 线程通信

标签:sleep   放弃   class   over   生产者和消费者   同步代码块   nts   sum   out   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!