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

首页 > 软件编程 > java 更新日期: 2015-11-01
这篇文章主要介绍了JAVA线程同步的代码学习示例,大家参考使用吧

一、问题描述

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

二、解决方案

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

代码如下:

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();
            }
        }
    }
   
}


> 本站内容系网友提交或本网编辑转载,其目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请及时与本网联系,我们将在第一时间删除内容!

相关文章
  • Java线程同步详解
    这篇文章主要给大家详细介绍的是Java 线程同步的相关问题及代码示例,有需要的小伙伴可以参考下Java 线程同步根本上是要符合一个逻辑:加锁------>修改------>释放锁 1.同步代码块 示例如下: public class SyncBlock { static class DataWrap { int i; } static class ...
  • Java线程同步实例分析
    这篇文章主要介绍了Java线程同步用法,实例分析了java中线程同步的相关实现技巧与注意事项,具有一定参考借鉴价值,需要的朋友可以参考下本文实例讲述了Java线程同步的用法.分享给大家供大家参考.具体分析如下: 多线程的使用为我们的程序提供了众多的方便,同时它也给我们带来了以往没有考虑过的麻烦.当我们使用多线程处理共享资源时意外将会发生:比如我们一起外出就餐 ...
  • ruby线程实现生产者消费者问题示例(队列Queue实现线程同步)
    这篇文章主要介绍了ruby线程实现生产者消费者问题示例队列Queue实现线程同步,需要的朋友可以参考下Ruby线程实现经典的生产者消费者问题,用ruby中的Queue类实现线程同步问题. 代码如下:require "thread"  puts "ProAndCon"  queue = Queue.new    #用队列 ...
  • 深入解析Java的线程同步以及线程间通信
    这篇文章主要介绍了Java的线程同步以及线程间通信,多线程编程是Java学习中的重点和难点,需要的朋友可以参考下Java线程同步当两个或两个以上的线程需要共享资源,它们需要某种方法来确定资源在某一刻仅被一个线程占用.达到此目的的过程叫做同步(synchronization).像你所看到的,Java为此提供了独特的,语言水平上的支持. 同步的关键是管程(也叫信 ...
  • Lua编程示例八:生产者-消费者问题
    Lua编程示例八:生产者-消费者问题
    这篇文章主要介绍了Lua编程示例八:生产者-消费者问题,本文直接给出实例代码,需要的朋友可以参考下这个问题是比较经典的啦,基本所有语言的多线程都会涉及到,但是没想到Lua的这个这么复杂 抓狂   看了好长时间才算看明白,先上个逻辑图:    开始时调用消费者,当消费者需要值时,再调用生产者生产值,生产者生产值后停止,直到消费者再次请求.设计为消费者驱动的设计 ...
猜你喜欢