/**

*1. 5辆汽车过山洞,依次经过山洞。每辆车通过山洞花费10秒,使用多线程实现。

*/


//山洞

class Cave

{

}


//汽车

class Car extends Thread

{

private String name;

private Cave cave;

public Car()

{}


public Car(Cave cave ,String name)

{

this.cave = cave;

this.name = name;

}


public void run()

{

synchronized(cave)

{

System.out.println(name + ",进洞了!");

try

{

Thread.sleep(1000);

System.out.println(name + "出洞了");

}

catch (Exception e)

{

System.out.println("错了!");

}

}

}

}


class ThreadDemo3

{

public static void main(String[] args)

{

Cave cave = new Cave();

Car c1 = new Car(cave,"C1");

Car c2 = new Car(cave,"C2");

Car c3 = new Car(cave,"C3");

Car c4 = new Car(cave,"C4");

Car c5 = new Car(cave,"C5");


c1.start();

c2.start();

c3.start();

c4.start();

c5.start();



}

}


/**

*2. 用多线程模拟蜜蜂和熊的关系。

   蜜蜂是生产者,熊是消费者。蜜蜂生产蜂蜜是累加的过程,熊吃蜂蜜是批量(满100吃掉)的过程。

   生产者和消费者之间使用通知方式告知对方。注意不能出现死锁的现象。

*/


class SmallBee extends Thread

{

private java.util.List<Integer> list ;

final static int MAX = 100;

private String name;


public SmallBee(String name,java.util.List<Integer> list)

{

this.name = name;

this.list = list;

}


public void run()

{

while (true)

{

synchronized(list)

{

//添加蜂蜜

if (list.size() < MAX)

{

list.add(new Integer(list.size()));

try

{

Thread.sleep(100);

}

catch (Exception e)

{

}

System.out.println(name + ":" + list.size());

//通知 线程 == 熊 

list.notify();

}

//蜂蜜满了--- 等待 

if (list.size() == MAX)

{

System.out.println("蜂蜜满了,快来吃。。。");

try

{

list.wait();

}

catch (Exception e)

{

}

}

}

}

}


}


class Bear extends Thread

{

private java.util.List<Integer> list ;


private String name;


public Bear(String name , java.util.List<Integer> list)

{

this.name = name;

this.list = list;

}


public void run()

{

while (true)

{

synchronized (list){

//查看蜂蜜是否满了

if (list.size() >= 100)

{

System.out.println("开始吃蜂蜜了,蜂蜜数量:"+list.size());

//remove 前100个元素

for (int j = list.size()-1;j >= 0  ;j-- )

{

Integer tmp = list.remove(j);

System.out.println(name + "吃了"+tmp);

}


System.out.println("已经吃完了,蜂蜜还剩余:"+list.size());


list.notify();


}else

{

try

{

System.out.println("等蜂蜜吃");

list.wait();

}

catch (Exception e)

{

}

}

}

yield();

}

}

}


class ThreadDemo4

{

public static void main(String[] args)

{

java.util.List<Integer> list = new java.util.ArrayList<Integer>();


SmallBee sb1 = new SmallBee("S1",list);

SmallBee sb2 = new SmallBee("S2",list);

SmallBee sb3 = new SmallBee("S3",list);


Bear b1 = new Bear("熊大",list);

Bear b2 = new Bear("熊二",list);


sb1.start();

sb2.start();

sb3.start();

b1.start();

b2.start();


}

}