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.生產者怎麼提醒消費者可以搶佔線程了