1 synchronized
package com.gc.test;
/**
* 生产者消费者问题
* 1 店员
* 2 生产者
* 3 消费者
* @author jiji
*
*/
public class ProducetAndConsumerTest {
public static void main(String[] args) {
ShopPerson shop = new ShopPerson();
Product product = new Product(shop);
Consumer cum = new Consumer(shop);
new Thread(cum,"消费者1").start();;
new Thread(product,"生产者1").start();;
new Thread(cum,"消费者2").start();;
new Thread(product,"生产者2").start();;
}
}
/**
* 店员
* @author jiji
*
*/
class ShopPerson{
private Integer shopNum=0; //初始商品数量为0
//**卖货
public synchronized void getShop(){
try{
while(shopNum<=0){
System.out.println("-----------缺货");
this.wait();
}
System.out.println(Thread.currentThread().getName()+"消费:"+ --shopNum);
this.notifyAll();
}catch(Exception e){
}
}
public synchronized void productShop(){
try{
while(shopNum>=10){
System.out.println("-----------货物满了");
this.wait();
}
System.out.println(Thread.currentThread().getName()+":"+ ++shopNum);
this.notifyAll();
}catch(Exception e){
}
}
}
class Product implements Runnable{
private ShopPerson shop;
public Product(ShopPerson shop) {
this.shop = shop;
}
@Override
public void run() {
for (int i=0;i<20;i++) {
shop.productShop();
}
}
}
class Consumer implements Runnable{
private ShopPerson shop;
public Consumer(ShopPerson shop) {
this.shop = shop;
}
@Override
public void run() {
for (int i=0;i<20;i++) {
shop.getShop();
}
}
}
2 lock方式
package com.gc.test;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* 生产者消费者问题
* 1 店员
* 2 生产者
* 3 消费者
* @author jiji
*
*/
public class ProducetAndConsumerLock {
public static void main(String[] args) {
ShopPerson1 shop = new ShopPerson1();
Product1 product = new Product1(shop);
Consumer1 cum = new Consumer1(shop);
new Thread(product,"生产者1").start();;
new Thread(cum,"消费者1").start();;
new Thread(product,"生产者2").start();;
new Thread(cum,"消费者2").start();;
}
}
/**
* 店员
* @author jiji
*
*/
class ShopPerson1{
private Integer shopNum=0; //初始商品数量为0
private Lock lock = new ReentrantLock();
private Condition condition = lock.newCondition();
//**卖货
public void getShop(){
lock.lock();
try{
while(shopNum<=0){
System.out.println("-----------缺货");
condition.await();
}
System.out.println(Thread.currentThread().getName()+"消费:"+ --shopNum);
condition.signalAll();
}catch(Exception e){
}finally {
lock.unlock();
}
}
public void productShop(){
lock.lock();
try{
while(shopNum>=10){
System.out.println("-----------货物满了");
condition.await();
}
System.out.println(Thread.currentThread().getName()+":"+ ++shopNum);
condition.signalAll();
}catch(Exception e){
}finally {
lock.unlock();
}
}
}
class Product1 implements Runnable{
private ShopPerson1 shop;
public Product1(ShopPerson1 shop) {
this.shop = shop;
}
@Override
public void run() {
for (int i=0;i<20;i++) {
shop.productShop();
}
}
}
class Consumer1 implements Runnable{
private ShopPerson1 shop;
public Consumer1(ShopPerson1 shop) {
this.shop = shop;
}
@Override
public void run() {
for (int i=0;i<20;i++) {
shop.getShop();
}
}
}