版权声明:未经博主同意,禁止转载,联系方式qq2928013321 https://blog.csdn.net/weixin_42130471/article/details/82844045
注意事项:
1、sleep()和wait()区别:
sleep:进入【普通】阻塞队列;不释放锁;可以在任何地方使用。
wait:进入【该监视器】阻塞队列,是与sleep不同的阻塞队列;释放锁;wait()只能在【监视器同步块中使用】,不然会报错并且进入的。
2、wait前面加product对象,product.wait(),不然默认this.wait(),会导致进入不同的队列。
3、wait(),notify(),notify()必须是同一个同步监视器的,一定要在同步块内。
4、wait()还有一种使用方法wait(time),wait(time)时间到了就唤醒线程,不需要notify()。
5、notify()唤醒该监视器的【任意一个】线程,notifyAll()唤醒该监视器的所有线程。
6、yield()和sleep()区别如下图。
生产者线程;
package ProduceConsum;
public class Produce implements Runnable{
private Product product=null;
public Produce(Product product) {
super();
this.product = product;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
}
@Override
public void run() {
int i=0;
while(true) {
synchronized(product) {//生产者和消费者都必须加锁,并且必须加同一把锁
if(product.flag) {
try {
product.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if((i&1)==0) {
product.setName("馒头");
try {
Thread.sleep(1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
product.setColor("白色");
System.out.println("生产者在生产商品 "+product.getName()+" "+product.getColor());
}else {
product.setName("玉米");
try {
Thread.sleep(1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
product.setColor("红色");
System.out.println("生产者在生产商品 "+product.getName()+" "+product.getColor());
}
i++;
product.flag=true;
product.notify();
}
}
}
}
消费者线程;
package ProduceConsum;
public class Consum implements Runnable{
private Product product=null;
public static void main(String[] args) {
// TODO Auto-generated method stub
}
@Override
public void run() {
while(true) {
synchronized(product){
if(!product.flag) {
try {
product.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("消费者在消费产品"+product.getName()+product.getColor());
product.flag=false;
product.notify();
}
}
}
public Consum(Product product) {
super();
this.product = product;
}
}
产品类;
package ProduceConsum;
public class Product {
private String name;
private String color;
public boolean flag=false;
public String getName(){
return name;
}
public void setName(String name) {
this.name = name;
}
public void setColor(String color) {
this.color = color;
}
public String getColor() {
return color;
}
public Product() {
super();
}
public Product(String name, String color) {
super();
this.name = name;
this.color = color;
}
@Override
public String toString() {
return "product [name=" + name + ", color=" + color + "]";
}
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}
主代码:
package ProduceConsum;
public class test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Object obj;
Product product=new Product();
Runnable p=new Produce(product);
Thread th1=new Thread(p);
Runnable c=new Consum(product);
Thread th2=new Thread(c);
th1.start();
th2.start();
}
}
二、同步方法实现:
生产者线程:
package ProduceConsum.copy1;
public class Produce implements Runnable{
private Product product=null;
public Produce(Product product) {
super();
this.product = product;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
}
@Override
public void run() {
int i=0;
while(true) {
if((i&1)==0) {
product.producing("馒头", "白色");
}else {
product.producing("玉米", "红色");
}
i++;
}
}
}
消费者线程:
package ProduceConsum.copy1;
public class Consum implements Runnable{
private Product product=null;
public static void main(String[] args) {
// TODO Auto-generated method stub
}
@Override
public void run() {
while(true) {
product.consuming();
}
}
public Consum(Product product) {
super();
this.product = product;
}
}
产品类(内含同步方法):
package ProduceConsum.copy1;
public class Product {
private String name;
private String color;
public boolean flag=false;
public synchronized void producing(String name,String color) {
this.name=name;
this.color=color;
if(flag) {
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
try {
Thread.sleep(1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("生产者在生产商品 "+name+" "+color);
this.flag=true;
this.notify();
}
public synchronized void consuming() {
if(!flag) {
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("消费者在消费产品"+name+color);
flag=false;
notify();
}
}
主方法:
package ProduceConsum.copy1;
public class test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Object obj;
Product product=new Product();
Runnable p=new Produce(product);
Thread th1=new Thread(p);
Runnable c=new Consum(product);
Thread th2=new Thread(c);
th1.start();
th2.start();
}
}