java线程---生产者与消费者,同步问题

Posted CiscoLee

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java线程---生产者与消费者,同步问题相关的知识,希望对你有一定的参考价值。

技术图片
package com.thread.sync;

class common {//同步资源池
    private char ch; //****资源池公用资源***
    private boolean available=false;//默认等待生产数据
    synchronized char get(){//定义同步资源方法,消费者使用
        while (available==false)//当资源没有生产的时候,一直等待,当available==false时,条件为**"真"**,执行while,里面wait实现 等待
            try {
                wait(); //等待
            } catch (Exception e){}
        available=false;
        return ch;
    }
    
    synchronized void put(char newch){//生产者将要使用其生产数据
        while(available==true)//当available==true时,条件依然为**真**,内部也是等待生产者将数据放入,也就是说while无论是在get方法还是这里,都是作为线程等待 数据判断的依据,也就可以理解在synchronized声明的方法中,其实是同步进行的。
                              //即等待和后续其实都是在进行的,而他等待的是”多线程“来放入数据或者拿取数据
            try {
                wait();
            } catch (InterruptedException e) {}
        ch=newch;
        available=true;//标记,”告诉别人可以取值 了,或者消费了,我有产品了“
        notify();//唤醒消费者线程
    }
}


//生产者
class producer extends Thread{
    private common comm;  //同步资源类
    public producer(common thiscomm){
        comm = thiscomm;//指向同步资源类
    }
    @Override
    public void run() {
        char c;
        for (c=‘a‘;c<=‘e‘;c++) {
            System.out.println("生产者生产了数据"+c);
            comm.put(c);
        }
    }
}

class consumer extends Thread{
    private common comm;//同步资源类
    public consumer(common thiscomm){
        comm = thiscomm;//指向同步资源类
    }
    @Override
    public void run() {
        char c;
        for (int i = 0; i < 5; i++) {
            c = comm.get();
            System.out.println("消费者得到的数据"+c);
        }
        
    }    
}

//消费者,从生产者和消费者类来看,他们都共同使用同步资源类,同时构造方法指向同步资源,并且他们共同操作同步资源数据
//消费者和生产者都继承了Thread类,并覆盖了run方法,一个用来生产数据,一个消费数据
//生产者与消费者,"同步资源池";生产者生产数据,放入资源池;消费者消费数据,使用资源池;主程序new并实现
public class ThreadSync {
    public static void main(String[] args) {
        common comm = new common();
        producer p = new producer(comm);
        consumer c = new consumer(comm);//一个生产,多个消费
        consumer c1 = new consumer(comm);
        p.start();c.start();c1.start();
    }
}
View Code

 

以上是关于java线程---生产者与消费者,同步问题的主要内容,如果未能解决你的问题,请参考以下文章

java线程---生产者与消费者,同步问题

“全栈2019”Java多线程第二十六章:同步方法生产者与消费者线程

Java基础之多线程

java线程同步中没有信号量的生产者消费者问题

多线程核心点

Java多线程与并发库4.传统线程同步通信技术