• 手机版

    扫码体验手机版

  • 微信公众号

    扫码关注公众号

国内首家协议开发

软芯音视解码保护平台

在线
客服

发布
需求

在线
聊天

天盟
APP

天盟APP下载

关注
微信

微信扫一扫访问
顶部

多线程的问题(消费者和生产者) 消费者无法消费

package pack01;


import java.util.ArrayList;
import java.util.List;


/**
* 测试缓存区
* @author
*
*/
public class TestBuffer {
        public static void main(String[] args) {
                List list = new ArrayList();//生成一个缓存区的储存器
                Buffer buffer = new Buffer(list,20);//生成一个缓存区
               
                Consumer consumer = new Consumer(buffer);//生成一个消费者
                Producer producer = new Producer(buffer);//生成一个生产者
               
                new Thread(producer).start();//启动线程
                new Thread(consumer).start();
               
        }
}


class Consumer implements Runnable//消费者
{
        private Buffer buffer;//为消费者指定缓存区
       
        public Consumer(Buffer buffer) {
                //在构造器中指定缓存区
                this.buffer = buffer;
        }
       
        public synchronized void consume()//消费
        {
                if(this.buffer.dataBuffer.size() == 0)
                {
                        System.out.println("缓存区中无数据可消费!");
                        try {
                                this.wait();//如果缓存区中无数据可消费 暂停该线程
                        } catch (InterruptedException e) {
                                e.printStackTrace();
                        }
                }
                this.buffer.dataBuffer.remove(this.buffer.dataBuffer.size()-1);
                this.buffer.len--;//缓存区的当前大小减1
                this.notifyAll();//消费完毕 通知其他线程
       
        }
        @Override
        public void run() {
                for(int i = 1; i < 10; i++)
                {
                        this.consume();
                        System.out.println("消费第"+i+"个数据");
                }
        }
       
}


class Producer implements Runnable//生产者
{
        private Buffer buffer;//为生产者指定容器
       
        public Producer(Buffer buffer) {
                this.buffer = buffer;//在构造器中指定容器
        }
       
        public synchronized void produce(Data data)//生产
        {
                if(this.buffer.dataBuffer.size() == this.buffer.maxSize)//如果缓存区的大小等于缓存区的最大大小
                {
                        System.out.println("缓存区已满!");
                        try {
                                this.wait();//如果缓存区已满 就暂停该线程
                        } catch (InterruptedException e) {
                                e.printStackTrace();
                        }
                }
                this.buffer.dataBuffer.add(data);//如果不等 则往缓存区中加入data
                this.buffer.len++;//缓存区的当前大小加1
                this.notifyAll();//生产完毕 通知其他线程
        }
       
        @Override
        public void run() {

                for(int i = 1; i

免责声明:本内容仅代表回答会员见解不代表天盟观点,请谨慎对待。

版权声明:作者保留权利,不代表天盟立场。

使用道具 举报

发新帖

发布任务需求已有1031166位用户正在使用天盟网服务

发布分类: *
任务预算: *
需求内容: *
手机号码: *
任务商家报价为
  • 预算价 :
  • 成交价 :
  • 完工期 :
  • 质保期 :

* 最终任务项目以服务商报价、双方协商为准!