感謝大家對IT十八掌大數據的支持,今天的作業如下
1. 5輛汽車過山洞,依次經過山洞。每輛車通過山洞花費10秒,使用多線程實現。
2. 用多線程模擬蜜蜂和熊的關係。
蜜蜂是生產者,熊是消費者。蜜蜂生產蜂蜜是累加的過程,熊吃蜂蜜是批量(滿100吃掉)的過程。
生產者和消費者之間使用通知方式告知對方。注意不能出現死鎖的現象。
-------------------------------------------------------------------------------------------
5輛汽車過山洞,依次經過山洞。每輛車通過山洞花費10秒,使用多線程實現。
public class CarTest {
public static void main(String[] args) {
Cave cave = new Cave();
Car car1 = new Car(cave, "car1");
Car car2 = new Car(cave, "car2");
Car car3 = new Car(cave, "car3");
Car car4 = new Car(cave, "car4");
Car car5 = new Car(cave, "car5");
car1.start();
car2.start();
car3.start();
car4.start();
car5.start();
}
}
class Car extends Thread{
private Cave mCave;
private String mName;
public Car(Cave cave, String name) {
super();
this.mCave = cave;
this.mName = name;
}
@Override
public void run() {
synchronized (mCave) {
System.out.println(mName + "開始穿過山洞");
try {
sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(mName + "完成穿過山洞");
}
}
}
class Cave {
}
2. 用多線程模擬蜜蜂和熊的關係。
蜜蜂是生產者,熊是消費者。蜜蜂生產蜂蜜是累加的過程,熊吃蜂蜜是批量(滿100吃掉)的過程。
生產者和消費者之間使用通知方式告知對方。注意不能出現死鎖的現象。
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){}
}
}
}
}
}