欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JAVA生产者消费者(线程同步)代码学习示例

程序员文章站 2024-02-16 10:30:40
一、问题描述 生产者消费者问题是一个典型的线程同步问题。生产者生产商品放到容器中,容器有一定的容量(只能顺序放,先放后拿),消费者消费商品,当容器满了后,生产者等待,当容...

一、问题描述

生产者消费者问题是一个典型的线程同步问题。生产者生产商品放到容器中,容器有一定的容量(只能顺序放,先放后拿),消费者消费商品,当容器满了后,生产者等待,当容器为空时,消费者等待。当生产者将商品放入容器后,通知消费者;当消费者拿走商品后,通知生产者。

二、解决方案

对容器资源加锁,当取得锁后,才能对互斥资源进行操作。

复制代码 代码如下:

public class producerconsumertest {

    public static void main(string []args){
        container con = new container();
        producer p = new producer(con);
        consumer c = new consumer(con);
        new thread(p).start();
        new thread(c).start();
    }

}


class goods{
    int id;
    public goods(int id){
        this.id=id;
    }

    public string tostring(){
        return "商品"+this.id;
    }
}

class container{//容器采用栈,先进后出
    private int index = 0;
    goods[] goods = new goods[6];

    public synchronized void push(goods good){
        while(index==goods.length){//当容器满了,生产者等待
            try {
                wait();
            } catch (interruptedexception e) {
                // todo auto-generated catch block
                e.printstacktrace();
            }
        }
        goods[index]=good;
        index++;
        notifyall();//当生产者放入商品后通知消费者
    }

    public synchronized goods pop(){
        while(index==0){//当容器内没有商品是等待
            try {
                wait();
            } catch (interruptedexception e) {
                // todo auto-generated catch block
                e.printstacktrace();
            }
        }
        index--;
        notifyall();//当消费者消费了商品后通知生产者
        return goods[index];
    }
}

class producer implements runnable{

    container con = new container();
    public producer(container con){
        this.con=con;
    }

    public void run(){
        for(int i=0; i<20; i++){
            goods good = new goods(i);
            con.push(good);
            system.out.println("生产了:"+good);
            try {
                thread.sleep(100);
            } catch (interruptedexception e) {
                // todo auto-generated catch block
                e.printstacktrace();
            }
        }
    }

}

class consumer implements runnable{

    container con = new container();
    public consumer(container con){
        this.con=con;
    }

    public void run(){
        for(int i=0; i<20; i++){
            goods good=con.pop();
            system.out.println("消费了:"+good);
            try {
                thread.sleep(1000);
            } catch (interruptedexception e) {
                // todo auto-generated catch block
                e.printstacktrace();
            }
        }
    }

   
}