Java多线程的生产者与消费者问题

本文探讨了Java中多线程的生产者与消费者问题,包括相关概念和示例代码,旨在阐述如何在多线程环境下协调生产者和消费者的同步操作。
摘要由CSDN通过智能技术生成

多线程的生产者与消费者问题

package com.company;

import java.util.Arrays;

//该类即生产者和消费者的问题,因为pos为对象ss的实例变量,同一个对象pos的值唯一,本例中pos
//当pos的值等于10时,不在增长,并且生产者线程Produser因为write()方法里有wait()方法而被阻塞,
//等消费者线程将数组内容取走时将pose置零,notify()唤醒线程,生产者继续生产
public class ShareArea {
    //定义相关变量
    private  byte data[]=new  byte[10];         //缓冲区,长度为10
    private int pos=0;              //写入位置

    //定义一个方法,将数据写入缓冲区,该方法供生产者使用
    public synchronized  void write(byte value){
                //没有轮到生产者就等待
        while (pos==10){
            try {
                wait();
            }catch (InterruptedException e){};
        }

        //notify()写在哪都行,只要在write()方法内,whil循环外都可将线程唤醒
        data[pos]=value;  //生产者在pos位置写入一个值
        notify();
        pos++;


    }



    //定义一个方法充当消费者
    public  synchronized byte[] read(){
        while (pos<10){

            try{
                wait();
            }catch (InterruptedException e){};
        }

        //pos等于10时复制数组,

        byte[] data2= Arrays.copyOf(data,10);
        pos=0;
        notify();
        return  data2;

    }

    //定义main方法
    public  static void main(String [] args){

        ShareArea ss=new ShareArea();
        Consumer c=new Consumer(ss);
        Produser p=new Produser(ss);

        //启动俩个线程
        p.start();
        c.start();



    }
}

        //定义生产者,消费者线程

class  Consumer extends Thread{

    private  ShareArea sb;

    //获得主类对象
    public  Consumer(ShareArea s){
        sb=s;
    }

    //定义run方法

    public  void  run(){


        for (int i=0;i<10;i++){         //读取数据10次
            byte [] value=sb.read();
            for (int k=0;k<10;k++){
                System.out.println("消费:"+value[k]);
            }
        }

    }


}

//定义生产者类
class Produser extends Thread{
    private  ShareArea sb;

    //获得主类对象
    public  Produser(ShareArea s){
        sb=s;
    }

    public void run(){

        //每次生产100个
        for (byte i=0;i<100;i++){

            //让线程随机延时
            try {
                Thread.sleep((int)(Math.random()*1000));
            }catch (InterruptedException e){};

            sb.write(i);
            System.out.println("生产:"+i);
        }

    }



}

运行结果


生产:0
生产:1
生产:2
生产:3
生产:4
生产:5
生产:6
生产:7
生产:8
生产:9
消费:0
消费:1
消费:2
消费:3
消费:4
消费:5
消费:6
消费:7
消费:8
消费:9
生产:10
生产:11
生产:12
生产:13
生产:14
生产:15
生产:16
生产:17
生产:18
生产:19
消费:10
消费:11
消费:12
消费:13
消费:14
消费:15
消费:16
消费:17
消费:18
消费:19
生产:20
生产:21
生产:22
生产:23
生产:24
生产:25
生产:26
生产:27
生产:28
生产:29
消费:20
消费:21
消费:22
消费:23
消费:24
消费:25
消费:26
消费:27
消费:28
消费:29
生产:30
生产:31
生产:32
生产:33
生产:34
生产:35
生产:36
生产:37
生产:38
生产:39
消费:30
消费:31
消费:32
消费:33
消费:34
消费:35
消费:36
消费:37
消费:38
消费:39
生产:40
生产:41
生产:42
生产:43
生产:44
生产:45
生产:46
生产:47
生产:48
生产:49
消费:40
消费:41
消费:42
消费:43
消费:44
消费:45
消费:46
消费:47
消费:48
消费:49
生产:50
生产:51
生产:52
生产:53
生产:54
生产:55
生产:56
生产:57
生产:58
生产:59
消费:50
消费:51
消费:52
消费:53
消费:54
消费:55
消费:56
消费:57
消费:58
消费:59
生产:60
生产:61
生产:62
生产:63
生产:64
生产:65
生产:66
生产:67
生产:68
生产:69
消费:60
消费:61
消费:62
消费:63
消费:64
消费:65
消费:66
消费:67
消费:68
消费:69
生产:70
生产:71
生产:72
生产:73
生产:74
生产:75
生产:76
生产:77
生产:78
生产:79
消费:70
消费:71
消费:72
消费:73
消费:74
消费:75
消费:76
消费:77
消费:78
消费:79
生产:80
生产:81
生产:82
生产:83
生产:84
生产:85
生产:86
生产:87
生产:88
生产:89
消费:80
消费:81
消费:82
消费:83
消费:84
消费:85
消费:86
消费:87
消费:88
消费:89
生产:90
生产:91
生产:92
生产:93
生产:94
生产:95
生产:96
生产:97
生产:98
生产:99
消费:90
消费:91
消费:92
消费:93
消费:94
消费:95
消费:96
消费:97
消费:98
消费:99

随手写来,如有侵权,联系,删除

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值