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

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

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

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


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

class Car extends Thread{

private String name;

private static Object lock=new Object();

public Car(String name){

this.name=name;

}

public void run(){

//同步锁  表示同一时刻只能一个线程执行

synchronized(lock){

System.out.println(name +"汽车准备进山洞了");

try {

//大于10秒

Thread.sleep(1500);

}

catch(Exception e){

}

System.out.println(name +"汽车已经出山洞了");

}

}

}

class ThreadDemo11{

public static void main(String[] args){

Car c1=new Car("a");

Car c2=new Car("b");

Car c3=new Car("c");

Car c4=new Car("d");

Car c5=new Car("f");

c1.start();

c2.start();

c3.start();

c4.start();

c5.start();

}

}


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

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

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

//自己代码

//定义蜂箱累积蜂蜜容器

class BeeVol{

public static int allVol=0;

public synchronized void setVol(int vol){

this.allVol=vol+this.allVol;

}

public synchronized int getVol(){

return allVol;

}

}


//蜜蜂采蜜积累蜜

class Bee extends Thread{

private String name;

private int vol;

private static Object lock=new Object();

//public static int sum=0;

public Bee(String name,int vol){

this.name=name;

this.vol=vol;

}

public void run() {

try{

while(true){

if ( BeeVol.allVol>=100){

Thread.sleep(1000);

}

 //同步锁  表示同一时刻只能一个线程执行

 synchronized(lock){

System.out.println("蜜蜂"+name+"采蜜了");

//Thread.sleep(1000);

BeeVol.allVol=BeeVol.allVol+vol;

System.out.println("现在有"+BeeVol.allVol+"蜜。");

Thread.sleep(1000);

//yield();

}

 }

}

catch(Exception e){

e.printStackTrace();

}

 }

}

///*

//熊大吃蜜

class Bear extends Thread {

private String name ;

public Bear(String name){

this.name=name;

}

public void run(){

try{

while( true ){

if(BeeVol.allVol>=100){

Thread.sleep(100);

BeeVol.allVol = BeeVol.allVol-100;

System.out.println(name +"吃了蜜100,现在蜜是:"+BeeVol.allVol);

Thread.sleep(1000);

}

}

}

catch(Exception e){ 

e.printStackTrace();

}

}

}

//*/

class ThreadDemo12{

public static void main(String[] args) throws Exception{

Bee b1= new Bee("蜜蜂a",10);

Bee b2= new Bee("蜜蜂b",20);

Bee b3= new Bee("蜜蜂c",20);

Bee b4= new Bee("蜜蜂d",30);

Bear be1=new Bear("熊大");

b1.start();

b2.start();

b3.start();

b4.start();

be1.start();

}

}


//老师的代码

package com.it18zhang_08.job.demo;

public class HoneyDemo{

public static void main(String[] args){

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

Bee p = new Bee(list,"kk");

Bear c1 = new Bear(list,"");

//启动生产者和消费者

p.start();

c1.start();

}

}


//生产者

class Bee extends Thread{

final static int MAX = 100 ;

java.util.List<Integer> list ;

String name ;

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

this.list = list ;

this.name = name ;

}

//放置数据

public void run(){

int i = 1 ;

while(true){

//对集合进行同步

synchronized(list){

int size = list.size();

if(size >= MAX){

try{

list.wait();

}

catch(Exception e){}

}

else{

list.add(new Integer(i));

System.out.println("P : " + i);

i ++ ;

list.notify();

}

}

}

}

}

//消费者

class Bear extends Thread{

java.util.List<Integer> list ;

String name ;

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

this.list = list ;

this.name = name ;

}

//取数据

public void run(){

while(true){

synchronized(list){

int size = list.size();

//集合为空

if(size >= 100){

System.out.println("C size : " + size);

list.removeAll(list);

//通知等待队列中的线程。

list.notify();

}

else{

try{

list.wait();

}

catch(Exception e){}

}

}

}

}

}



学习过程中问题:

1.生产者怎么提醒消费者可以抢占线程了