阿里云面试题:生产者和消费者模型

某次面试阿里云,要求实时写一个小程序,要求如下:
1.两个线程,一个线程生产者,一个线程是消费者
2.生产者生产票,超过10张就休息,被消费了就继续生产。
3.消费者消费票,票没了之后就休息,有票了接着消费。
题目看着很简单,但却包含了很多考点:消息队列、线程、线程通信、锁。
具体看看我写的源码,这是后期几经修改后的内容。

import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;

/**
 * 某次面试阿里云,要求实时写一个小程序,要求如下:
 * 1.两个线程,一个线程生产者,一个线程是消费者
 * 2.生产者生产票,超过10张就休息,被消费了就继续生产。
 * 3.消费者消费票,票没了之后就休息,有票了接着消费。
 * 题目看着很简单,但却包含了很多考点:消息队列、线程、线程通信、锁。
 * 具体看看我写的源码,这是后期几经修改后的内容。
 */
public class Test {

    private static Queue queue = new ConcurrentLinkedQueue();

    private static Object lock = new Object();


    public static void main(String[] args) {
        //生产者线程
        Thread p = new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {

                    queue.add("piao");
                    System.out.println(Thread.currentThread().getName() + ":加票...余票有" + queue.size() + "张");

                    synchronized (lock) {
                        //每次生产完了之后通知一下等待中的消费者
                        lock.notify();

                        if (queue.size() >= 10) {
                            System.out.println(Thread.currentThread().getName() + ":票加满了");

                            try {
                                Thread.sleep(1000L);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }

                            try {
                                lock.wait();
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }

                        }
                    }

                    try {
                        Thread.sleep(1000L);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                }
            }
        }, "Provider");

        Thread c = new Thread(new Runnable() {
            @Override
            public void run() {

                while (true) {

                    String ticket = (String) queue.poll();
                    System.out.println(Thread.currentThread().getName() + ":取票...余票有" + queue.size() + "张");

                    try {
                        Thread.sleep(500L);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                    synchronized (lock) {
                        //每次消费完了之后通知一下等待中的生产者
                        lock.notify();

                        if (ticket == null) {
                            System.out.println(Thread.currentThread().getName() + ":票没有了");

                            try {
                                lock.wait();
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }

                        }
                    }


                }
            }

        }, "Comsumer");

        p.start();

        try {
            Thread.sleep(300L);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        c.start();

    }
}

 

 
posted @ 2021-08-11 18:19  gaopengpy  阅读(393)  评论(0编辑  收藏  举报