Java多线程与并发之两个线程协同工作演示[92]
一、概念
两个线程协同工作:先生产,再消费;
sleep: 让当前线程休眠,让出cpu时间片,不释放对象监视器所有权(对象锁)
this.wait(): 让当前线程进入等待状态,让出cpu时间片,并释放对象监视器所有权(对象锁),等待其他线程通过notify来唤醒;
notify: 唤醒其它等待线程;
二、代码演示
public static void main(String[] args) throws InterruptedException {
food f=new food();
ProSet ps=new ProSet(f);
ComGet cg=new ComGet(f);
Thread t1=new Thread(ps);
Thread t2=new Thread(cg);
t1.start();
t2.start();
}
//食物类
class food implements Runnable{
private String name;
private String desc;
public food(){};
private boolean flag=true;//true表示可以生产,不可以消费,false表示可以消费,不可以生产
//生产产品
public synchronized void set(String n,String d){
if (!flag){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.setName(n);
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.setDesc(d);
flag=false;
this.notify();
}
//消费产品
public synchronized void get(){
if (flag){
try {
this.wait();//让当前线程等待
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(this.getName()+"-"+this.getDesc());
flag=true;
this.notify();//唤醒其他等待锁
}
@Override
public String toString() {
return "food{" +
"name='" + name + '\'' +
", desc='" + desc + '\'' +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
@Override
public void run() {
}
}
//生产者
class ProSet implements Runnable{
private food food;
public ProSet(food f){
this.food=f;
}
@Override
public void run() {
for (int i = 0; i < 20; i++) {
if (i%2==0){
food.set("锅包肉","酸甜");
}else {
food.set("辣子鸡","麻辣");
}
}
}
}
//消费者
class ComGet implements Runnable{
private food food;
public ComGet(food f){
this.food=f;
}
@Override
public void run() {
for (int i=0;i<20;i++){
food.get();
}
}
}
三.小结
本章概述了java中两个线程协同工作的代码演示,是为巩固多线程与并发的概念而演示;
有哪里不足或者有更好的建议,欢迎留言吐槽,有哪里不懂的小伙伴,可以私信我,我会一一答复,感谢认可,感谢支持!