java基础第八天_多线程
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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.生产者怎么提醒消费者可以抢占线程了
本文出自 “作业” 博客,请务必保留此出处http://10718270.blog.51cto.com/10708270/1774316
以上是关于java基础第八天_多线程的主要内容,如果未能解决你的问题,请参考以下文章