Contents

20.7. 线程间通信

Stack.java

package com.a51work.cn;

public class Stack {
    //    指针指向初始值0
    private int pointer = 0;

    //    堆栈里面有5个字符的空间
    private char[] data = new char[5];

    //    压栈方法加上互斥锁
    public synchronized void push(char c) {
//        堆栈已满,不能压栈
        while (pointer == data.length) {
            try {
//                等待直到有数据出栈
                this.wait();
            } catch (InterruptedException e) {

            }
        }
//            通知其他线程把数据出栈
            this.notify();
//            数据压栈
            data[pointer] = c;
//            指针向上移动
            pointer++;
        }

    //    出栈方法加上互斥锁
    public synchronized char pop() {
//        堆栈无数据,不能出栈
        while (pointer == 0) {
            try {
//                等待直到有数据压栈
                this.wait();
            } catch (InterruptedException e) {

            }
        }
//            通知其他线程把数据压栈
        this.notify();
//            指针向下移动
        pointer--;
//            数据出栈
        return data[pointer];

    }
}

HelloWord03.java

package com.a51work.cn;

public class HelloWorld03 {
    public static void main(String[] args) {
        Stack stack = new Stack();
        // 下面的消费者和生产者所操作的是同一个堆栈对象stack
        // 生产者线程
        Thread producer = new Thread(() -> {
            char c;
            for (int i = 0; i < 10; i++) {
//            随机产生10个字符
                c = (char) (Math.random() * 26 + 'A');
//            把字符压栈
                stack.push(c);
//            打印字符
                System.out.println("生产: " + c);
                try {
//                每产生一个字符线程就睡眠
                    Thread.sleep((int) (Math.random() * 1000));
                } catch (InterruptedException e) {

                }
            }
        });

        // 消费者线程
        Thread consumer = new Thread(() -> {
            char c;
            for (int i = 0; i < 10; i++) {
//            从堆栈中读取字符
                c = stack.pop();
//            打印字符
                System.out.println("消费:" + c);
                try {
//                每产生一个字符线程就睡眠
                    Thread.sleep((int) (Math.random() * 1000));
                } catch (InterruptedException e) {
                }
            }
        });
    producer.start();       //启动生产者线程
    consumer.start();       //启动消费者线程
    }
}