java自学-线程通信(生产者和消费者问题)(同步块实现)

版权声明:未经博主同意,禁止转载,联系方式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();
	}

}

猜你喜欢

转载自blog.csdn.net/weixin_42130471/article/details/82844045