java 22 - 16 多线程之生产者和消费者的问题
生产者和消费者问题的描述图

通过上图,我们可以发现:
生产者和消费者使用的都是同一个资源(肉包子)
所以,当使用线程的时候,这两类的锁也是同一把锁(为了避免出现线程安全问题)
例子:学生信息的录入和获取
* 资源类:Student
* 设置学生数据:SetThread(生产者)
* 获取学生数据:GetThread(消费者)
* 测试类:StudentDemo
* 资源类:Student
public class Student {
String name;
int age;
}
* 设置学生数据:SetThread(生产者)
public class SetThread implements Runnable {
private int x = 0;
// 因为SetThread和Getthread两个类使用的都是同一个资源
// 所以,在创建一个资源对象,再通过构造方法传递给其它的类
private Student s;
public SetThread(Student s) {
this.s = s;
}
public void run() {
// 录入信息(生产者)
while (true) {
// 加锁,且SetThread和Getthread两个类使用的是同一把锁,所以锁的对象是资源对象s
synchronized (s) {
if (x % 2 == 0) {
s.name = "张三";
s.age = 23;
} else {
s.name = "李四";
s.age = 24;
}
x++;
}
}
}
}
* 获取学生数据:GetThread(消费者)
public class GetThread implements Runnable {
private Student s;
public GetThread(Student s){
this.s = s;
}
public void run() {
//获取信息 消费者
//锁的对象,同SetThread
while(true){
synchronized (s){
System.out.println(s.name +"--" + s.age);
}
}
}
}
* 测试类:StudentDemo
public class StudentDemo {
public static void main(String[] args) {
//创建资源对象
Student s = new Student();
//创建录入和获取类的对象
SetThread st = new SetThread(s);
GetThread gt = new GetThread(s);
//创建线程对象
Thread t1 = new Thread(st);
Thread t2 = new Thread(gt);
//启动线程
t1.start();
t2.start();
}
}
结果:
生产者SetThread类不断地录入学生信息(可以看成不断生产包子?)
而消费者GetThread类则不断地获取所录入的信息(买包子?)
当然,最理想的状态是生产者生产1个,消费者就立马消费1个....
但,这里还不是这种理想状态,两者还是得抢占CPU的资源,若是生产的多,则就堆积着等消费者。
若是消费者抢占的资源多,则一直消费的都是同一个包子?。。
java 22 - 16 多线程之生产者和消费者的问题的更多相关文章
- java 22 - 19 多线程之生产者和消费者的代码优化
在之前,是把生产者录入数据和消费者获取数据的所有代码都分别写在各自的类中. 这样不大好 这次把生产者和消费者部分关键代码都写入资源类中: package zl_Thread; public class ...
- JAVA之旅(十五)——多线程的生产者和消费者,停止线程,守护线程,线程的优先级,setPriority设置优先级,yield临时停止
JAVA之旅(十五)--多线程的生产者和消费者,停止线程,守护线程,线程的优先级,setPriority设置优先级,yield临时停止 我们接着多线程讲 一.生产者和消费者 什么是生产者和消费者?我们 ...
- 母鸡下蛋实例:多线程通信生产者和消费者wait/notify和condition/await/signal条件队列
简介 多线程通信一直是高频面试考点,有些面试官可能要求现场手写生产者/消费者代码来考察多线程的功底,今天我们以实际生活中母鸡下蛋案例用代码剖析下实现过程.母鸡在鸡窝下蛋了,叫练从鸡窝里把鸡蛋拿出来这个 ...
- Java:多线程之生产者与消费者
要求:用两个线程模拟存票.售票过程.但要求每存入一张票,就售出一张票,售出后,再存入,直到售完为止. 用到的知识点:线程等待.唤醒.可能的线程中断异常 下面的方式一和方式二采用的是唤醒所有等待的线程, ...
- java 22 - 17 多线程之等待唤醒机制(接16)
先来一张图,看看什么叫做等待唤醒机制 接上一章的例子. 例子:学生信息的录入和获取 * 资源类:Student * 设置学生数据:SetThread(生产者) * 获取学生数据:GetThread( ...
- java 22 - 20 多线程之线程池
程序启动一个新线程成本是比较高的,因为它涉及到要与操作系统进行交互. 而使用线程池可以很好的提高性能,尤其是当程序中要创建大量生存期很短的线程时,更应该考虑使用线程池. 线程池里的每一个线程代码结束后 ...
- java 22 - 12 多线程之解决线程安全问题的实现方式1
从上一章知道了多线程存在着线程安全问题,那么,如何解决线程安全问题呢? 导致出现问题的原因: A:是否是多线程环境 B:是否有共享数据 C:是否有多条语句操作共享数据 上一章的程序,上面那3条都具备, ...
- java 22 - 9 多线程之 代码实现的方式2
多线程的代码实现: 方式2:实现Runnable接口 步骤: A:自定义类MyRunnable实现Runnable接口 B:重写run()方法 C:创建MyRunnable类的对象 D:创建Threa ...
- java 22 - 7 多线程之控制线程的方法
线程休眠(让线程休息一会再运行) public static void sleep(long millis) 在自定义线程类中添加该方法. 更改后,运行测试类,结果就是每执行完一轮,就休息1秒(这里设 ...
随机推荐
- tomcat通过socket连接MySQL,不再占用服务端口【linux】
MySQL连接方式的说明 http://icbm.iteye.com/blog/1840673 MySQL除了最常见的TCP连接方式外,还提供SOCKET(LINUX默认连接方式).PIPE和SHAR ...
- Android项目实战(十七):QQ空间实现(二)—— 分享功能 / 弹出PopupWindow
这是一张QQ空间说说详情的截图. 分析: .点击右上角三个点的图标,在界面底部弹出一个区域,这个区域有一些按钮提供给我们操作 .当该区域出现的时候,详情界面便灰了,也说成透明度变化了 .当任意选了一个 ...
- 初学Spring有没有适合的书
初学者之前没有阅读java框架源码的习惯.没有阅读过源码,知道整体流程么?知道依赖注入的概念么?知道aop么?知道其中用到了哪些设计模式么?再说了,如果一上手就是源码?难道你没有注意到Spring的类 ...
- iOS开发常用小技巧记录(持续更新)
以下问题都是自己在项目中遇到的,解决问题的方法肯定有多种,我所列举的不一定就是最好的解决办法.如有问题欢迎大家指正,补充,交流. 解决同时按两个按钮进两个view的问题.[button setExcl ...
- 省市县三级联动 sql语句
发现在网上的省市县三级联动大部分是mysql的.就算是sqlserver的,也不准确.于是就把mysql的给改了下,适用sqlserver.sql语句如下: CREATE TABLE Dic_Area ...
- Nexus Repository Manager OSS 代理 p2 源
用maven管理构建Eclipse RCP项目时,可能会用到p2源: http://download.eclipse.org/releases/mars/ 内网用户肯定希望能通过nexus服务器代理, ...
- WPF学习之路(十二)控件(Range控件)
ProgressBar 进度条,主要属性:Minimum\Maximun\Value, IsIndeterminate为True时,进度条会循环运转 <Grid> <Grid.Row ...
- informatica powercenter学习笔记(LookUp 使用)
LOOKUP TRANSFORMATION的使用点评: LOOKUP基本用法不熟的话请参考下附属信息. 用法感受: 1 LOOKUP的作用跟我们以前在EXCEL的函数功能类似,就是隔表取值.优点就是用 ...
- HTTP状态码206和416
HTTP 2xx范围内的状态码表明了:"客户端发送的请求已经被服务器接受并且被成功处理了". TTP/1.1 200 OK是HTTP请求成功后的标准响应 HTTP/1.1 206状 ...
- CentOS6 Shell脚本/bin/bash^M: bad interpreter错误解决方法
在windows下保存了一个脚本文件,用ssh上传到centos,添加权限执行nginx提示没有那个文件或目录.shell脚本放到/etc/init.d/目录下,再执行/etc/init.d/ngin ...