您的位置:首页 > 编程语言 > Java开发

java基础第八天_多线程

2016-05-17 14:20 393 查看
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.生产者怎么提醒消费者可以抢占线程了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 基础 多线程