java线程---生产者与消费者,同步问题
2021-01-02 10:28
标签:c++ interrupt print vat closed bool except cat splay java线程---生产者与消费者,同步问题 标签:c++ interrupt print vat closed bool except cat splay 原文地址:https://www.cnblogs.com/ciscolee/p/12994727.htmlpackage 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) {
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 ) {
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();
}
}
下一篇:Centos7下安装java
文章标题:java线程---生产者与消费者,同步问题
文章链接:http://soscw.com/index.php/essay/39559.html