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

Java 管程解决生产者消费者问题

时间:2017-11-20 17:47:36      阅读:183      评论:0      收藏:0      [点我收藏+]

标签:font   href   mil   ++   产品   bool   封装   test   nts   

同样是实验存档。//。。

依然以生产者消费者问题作为背景。

管程(=“资源管理程序”)将资源和对资源的操作封装起来,资源使用者通过接口操作资源就 ok,不用去考虑进程同步的问题。

管程:

package entity.producerconsumer;

public class Monition {
    private Buffer buffer;

    public Monition(int bufferSize) {
        buffer = new Buffer(bufferSize);
    }

    /**
     * 如果放入产品成功返回 true
     * @return
     */
    public synchronized boolean put() {
        if (buffer.notFull()) {
            buffer.putItem();
            return true;
        }
        return false;
    }

    /**
     * 如果取出产品成功返回 true
     * @return
     */
    public synchronized boolean get() {
        if (buffer.notEmpty()) {
            buffer.getItem();
            return true;
        }
        return false;
    }

    public String getStatus() {
        return "" + buffer;
    }
}

 生产者 & 消费者:

package entity.producerconsumer;

public class Produc implements Runnable {
    /**
     * 统计生产者数量
     */
    private static int total = 0;
    /**
     * 生产者个体的 id
     */
    private int id;

    private Monition PC;

    public Produc(Monition monition) {
        id = ++total;
        PC = monition;
    }

    @Override
    public void run() {
        while (true) {
            if (PC.put()) {
                // 如果操作成功打印缓冲区状态
                System.out.println(id + " 号生产者: " + PC.getStatus());
            }
        }
    }
}

/

package entity.producerconsumer;

public class Consu implements Runnable {
    /**
     * 统计消费者数量
     */
    private static int total = 0;
    /**
     * 消费者个体的 id
     */
    private int id;

    private Monition PC;

    public Consu(Monition monition) {
        id = ++total;
        PC = monition;
    }

    @Override
    public void run() {
        while (true) {
            if (PC.get()) {
                // 如果操作成功打印缓冲区状态
                System.out.println(id + " 号消费者: " + PC.getStatus());
            }
        }
    }
}

/

Buffer.java

 

测试:

package test;

import entity.producerconsumer.Consu;
import entity.producerconsumer.Monition;
import entity.producerconsumer.Produc;

public class MonitionTest {
    public static void main(String[] args) {
        Monition PC = new Monition(10);
        // 创建 5 个生产者和 5 个消费者
        for (int i = 0; i != 5; ++i) {
            new Thread(new Produc(PC)).start();
            new Thread(new Consu(PC)).start();
        }
    }
}

 

Java 管程解决生产者消费者问题

标签:font   href   mil   ++   产品   bool   封装   test   nts   

原文地址:http://www.cnblogs.com/xkxf/p/7867042.html

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