• 多线程生产消费者示例


    来自尚硅谷视频
    生产者将产品交给店员,而消费者从店员处取走产品
    店员一次只能持有固定数量产品(比如20),如果生产者试图生产更多产品,店员会叫生产者停一下,
    如果店中有空位放产品,再通知生产者继续生产,如果店中没有产品,店员会告诉消费者等一下,如果店中有产品再通知消费者来取走产品。
    问题分析: 是否是对线程问题? 是,生产者、消费者
          是否共享数据?是,店员、产品
          是否涉及线程通信? 是
          如何解决线程安全问题?同步机制
        


    //共享数据模块
    class Clerk {
    private int counter = 0;

    // 从生产者获取产品
    public synchronized void product() {
    if (counter < 20) {
    notify();
    counter++;
    try {
    Thread.sleep(10);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    System.out.println(Thread.currentThread().getName() + ":开始生产第" + counter + "个产品");
    } else {
    try {
    wait();
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    }
    //给顾客提供产品
    public synchronized void sale() {
    if (counter > 0) {
    notify();

    System.out.println(Thread.currentThread().getName() + ":开始消费第" + counter + "个产品");
    counter--;
    } else {
    try {
    wait();
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    }
    }

    class Producter extends Thread {
    private Clerk clerk;

    public Producter(Clerk clerk) {
    this.clerk = clerk;
    }
    //生产产品
    public void run() {
    while (true) {
    try {
    Thread.sleep(10);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    this.clerk.product();
    }
    }
    }

    class Custom extends Thread {
    private Clerk clerk;

    public Custom(Clerk clerk) {
    this.clerk = clerk;
    }
    //消费产品
    public void run() {
    while (true) {
    try {
    Thread.sleep(200);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    this.clerk.sale();
    }
    }
    }

    public class Thread007 {
    public static void main(String[] args) {
    Clerk clerk=new Clerk();
    Producter producter=new Producter(clerk);
    producter.setName("生产者");
    Custom custom = new Custom(clerk);
    custom.setName("消费者一");
    Custom custom1 = new Custom(clerk);
    custom1.setName("消费者二");
    producter.start();
    custom.start();
    custom1.start();
    }
    }
  • 相关阅读:
    Tribonacci UVA 12470 (简单的斐波拉契数列)(矩阵快速幂)
    P1091 合唱队形
    P1481 魔族密码 (LIS)
    xiaowuga poj3735—Training little cats(特殊操作转化为矩阵操作)
    P2665 [USACO08FEB]连线游戏Game of Lines
    1875 丢手绢 (模拟+打表)
    Recurrences UVA 10870 (斐波拉契的一般形式推广)
    Choosing number ZOJ 3690 (矩阵快速幂)
    根据屏幕文件生成RPG代码的思路
    基于配置文件的查询,xml文件sample
  • 原文地址:https://www.cnblogs.com/kukai/p/12589566.html
Copyright © 2020-2023  润新知