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.生产者怎么提醒消费者可以抢占线程了

时间: 2024-08-26 14:49:07

java基础第八天_多线程的相关文章

IT十八掌作业_java基础第八天_多线程

感觉大家对IT十八掌大数据的支持,今天的作业如下 1. 5辆汽车过山洞,依次经过山洞.每辆车通过山洞花费10秒,使用多线程实现. 2. 用多线程模拟蜜蜂和熊的关系. 蜜蜂是生产者,熊是消费者.蜜蜂生产蜂蜜是累加的过程,熊吃蜂蜜是批量(满100吃掉)的过程. 生产者和消费者之间使用通知方式告知对方.注意不能出现死锁的现象.

java基础第九天_多线程、自动拆装箱

1.蜜蜂和熊的生产消费关系,熊在蜂蜜满10斤吃掉.蜜蜂一次生产一斤蜂蜜,且蜜蜂生成一斤蜂蜜花费的时间是10s. 十只蜜蜂和两只熊. 2.取出两个字符串中最大的公共子串. 3.StringBuffer是线程安全的,StringBuilder不是线程安全.单线程访问情况下,性能是否一致? 4.完成8中基本数据类包装类的练习,完成自动拆装箱操作. 1.蜜蜂和熊的生产消费关系,熊在蜂蜜满10斤吃掉.蜜蜂一次生产一斤蜂蜜,且蜜蜂生成一斤蜂蜜花费的时间是10s. 十只蜜蜂和两只熊. /** * 蜜蜂.熊的例

Java基础第八天听课总结(2)--多线程&Thread

进程 在任务管理器中查看进程,应用程序对应一个进程 进程之间的内存是隔离的,进程间是通过套接字通信Socket通信 什么是线程? ------------------------------ 线程是程序执行过程中,并发执行的代码段 线程之是可以共享内存. 线程的执行是从上往下按序执行的. 创建线程方式一 继承Thread 子类覆盖中的run方法,将线程执行的代码存放在run中 建立子类对象的同时线程也被创建. 通过调用start方法开启线程 Thread是线程类 start() //通知CPU可

Java基础知识强化之多线程笔记01:多线程基础知识(详见Android(java)笔记61~76)

1. 基础知识: Android(java)学习笔记61:多线程程序的引入    ~    Android(java)学习笔记76:多线程-定时器概述和使用 

java基础(3)-多线程(1)

java多线程 进程与线程 进程:指一个正在执行的应用程序.每个进程执行都有一个执行顺序,该顺序称为一个执行路径或一个控制单元(进程是资源分配的最小单位).一个进程包含1~n个线程 线程:指进程中某个单一顺序的控制流.线程控制着进程的执行(线程是CPU调度的最小单位) 多进程:指操作系统能同时运行多个任务(程序)多线程:指在同一程序中有多个顺序流在执行 实现java多线程 在java中要实现多线程,有两种方式,一种是继承Thread类,一种是实现Runable接口 方式一:继承Thread类并复

Java基础知识强化之多线程笔记05:Java中继承thread类 与 实现Runnable接口的区别

1. Java中线程的创建有两种方式:  (1)通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中. (2)通过实现Runnable接口,实例化Thread类. 2. 在实际应用中,我们经常用到多线程,如车站的售票系统,车站的各个售票口相当于各个线程.当我们做这个系统的时候可能会想到两种方式来实现,继承Thread类或实现Runnable接口,现在看一下这两种方式实现的两种结果. 继承thread类 1 package com.threadtest; 2 clas

java基础第十二天_集合

1.描述HashMap内部实现原理. HashMap存的是K-V对,K是唯一的不重复的. 在存储方式上hashmap底层实现了一个散列算法,散列是一种基于关键词的搜索算法,提升了hashmap的查找速度.hashmap的查找机制是先用对象的hashcode得出一个地址用equals比较地址中的链表的各个元素,如果形同,取出对应的value值. 2.描述Hashset和HashMap的区别. HashSet:HashSet集合内部是通过HashMap进行实现的,使用的是hashMap中key部分.

java基础--第八天

考虑年龄的输入需要判定引入: 封装: 定义:隐藏事物的属性与实现的细节,只提供公共方法进行操作. private关键字: 访问权限修饰符:可以修饰成员变量及函数:是封装的一种表现形式,还有类.函数等形式. set/get方法的说明: 需要提供公共方法,才能访问被private修饰的成员变量. set方法主要是修改成员变量的值: get方法主要是获取成员变量的值. 注意:set/get并不一定一起出现,根据实际需求来使用相应的功能. this关键字: 是当前所属成员函数类对象的引用. 每个类内方法

Java基础知识强化之多线程笔记07:同步、异步、阻塞式、非阻塞式 的联系与区别

1. 同步: 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回.但是一旦调用返回,就必须先得到返回值了. 换句话话说,调用者主动等待这个"调用"的结果. 对于同步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回而已. 2. 异步: 所谓异步,"调用"在发出之后,这个调用就直接返回了,所以没有返回结果. 换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果.而是在"调用"发出后,"被调用者&q