码迷,mamicode.com
首页 > 其他好文 > 详细

009 wait notify等方法

时间:2018-08-22 14:07:00      阅读:123      评论:0      收藏:0      [点我收藏+]

标签:not   boolean   遇到   pre   while   就是   span   inter   ted   

一 .概述

  当我们实现了原子性操作的时候,我们又会遇到一个问题,那就是线程之间通信的问题.所谓的线程通信,指的就是线程间的执行顺序是需要进行一定的控制的.

  我们拿最经典的生产者和消费者模型进行说明:

private static Object lock = new Object();
    private static int index = 1;
    private static volatile Boolean flag = true;

    /**
     * 生产者的线程
     */
    static class Provider {

        public static void proIndex() {
            synchronized (lock) {
                if (!flag) {
                    System.out.println(Thread.currentThread().getName() + "--" + index++);
                    lock.notify();
                    flag = !flag;
                } else {
                    try {
                        lock.wait();
                    } catch (InterruptedException e1) {
                        e1.printStackTrace();
                    }
                }

            }
        }
    }

    /**
     * 消费者的线程
     */
    static class Consumer {

        public static void conIndex() {
            synchronized (lock) {
                if (flag) {
                    System.out.println(Thread.currentThread().getName() + "--" + index);
                    lock.notify();
                    flag = !flag;
                } else {
                    try {
                        lock.wait();
                    } catch (InterruptedException e1) {
                        e1.printStackTrace();
                    }
                }
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {

        new Thread(() -> {
            while (true) {
                sleep();    
                Provider.proIndex();
            }
        }).start();
        new Thread(() -> {
            while (true) {
                sleep();
                Consumer.conIndex();
            }
        }).start();
    }
    
    private static void sleep() {
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

在这里,我们使用wait()和notify()方法进行实现.

  但是我们发现了一个问题,如果我们实现线程之间的通讯的代价实在是太高了.

于是在并发包之中为我们提供了一系列的线程通讯的工具,这些都会在后面进行分析.

009 wait notify等方法

标签:not   boolean   遇到   pre   while   就是   span   inter   ted   

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

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