java基礎第八天_多線程

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章