Java-J2SE学习笔记-线程-生产者消费者问题
一、概述
模拟生产者消费者问题
二、代码
1.Consumer.java
2.Producer.java
3.SyncStack.java
4.Test.java
1.Consumer.java
package ProducerConsumer;
public class Consumer implements Runnable {
private SyncStack syncStack;
public Consumer(SyncStack syncStack) {
super();
this.syncStack = syncStack;
}
public void consume(){
Product p;
for(int i = 0 ; i < 10 ; i++){
p = syncStack.pop();
System.out.println("******消费了:"+p);
}
}
@Override
public void run() {
// try {
// Thread.sleep(10);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
consume();
}
}
2.Producer.java
package ProducerConsumer;
public class Producer implements Runnable {
private SyncStack syncStack;
public Producer(SyncStack syncStack) {
super();
this.syncStack = syncStack;
}
public void produce(){
for(int i = 0 ; i < 10 ; i++){
Product p = new Product(i);
syncStack.push(p);
System.out.println("生产了:"+p);
}
}
@Override
public void run() {
produce();
}
}
3.SyncStack.java
package ProducerConsumer; import java.util.ArrayList;
import java.util.List; public class SyncStack { int index = 0;
Product [] ps = new Product[6];
//List<Product> ps = new ArrayList<Product>(); public synchronized void push(Product p) {
//if(index == ps.length){ //不能用if判断,若用if,则this.wait()出现异常时,代码仍会往下执行
while(index == ps.length){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.notifyAll();
ps[index] = p;
index = index + 1;
//System.out.println(index);
} public synchronized Product pop() {
while(index == 0){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.notifyAll();
index --;
return ps[index];
// System.out.println("ps===="+ps);
// Product p = ps.get(ps.size()-1);
// ps.remove(ps.size()-1);
// return p; }
}
4.Test.java
package ProducerConsumer;
public class Test {
public static void main(String[] args) {
SyncStack ss = new SyncStack();
Producer p1 = new Producer(ss);
Consumer c1 = new Consumer(ss);
Thread tp1 = new Thread(p1);
Thread tc1 = new Thread(c1);
tc1.start();
tp1.start();
new Thread(new Producer(ss)).start();
new Thread(new Consumer(ss)).start();
}
}
三、运行结果

四、小结
1.this.wait(),保有先锁定,才能调用wait,wait是使正在访问本对象的线程wait,且wait后此线程的锁会丢失,只有当线程醒来后才会再去找回锁。sleep则锁不会丢失。
2.this.notify()唤醒一个正在wait当前对象上的一个线程
Java-J2SE学习笔记-线程-生产者消费者问题的更多相关文章
- Java 多线程学习笔记:生产者消费者问题
前言:最近在学习Java多线程,看到ImportNew网上有网友翻译的一篇文章<阻塞队列实现生产者消费者模式>.在文中,使用的是Java的concurrent包中的阻塞队列来实现.在看完后 ...
- 2.5多线程(Java学习笔记)生产者消费者模式
一.什么是生产者消费者模式 生产者生产数据存放在缓冲区,消费者从缓冲区拿出数据处理. 可能大家会问这样有何好处? 1.解耦 由于有了缓冲区,生产者和消费者之间不直接依赖,耦合度降低,便于程序拓展和维护 ...
- Android(java)学习笔记71:生产者和消费者之等待唤醒机制
1. 首先我们根据梳理我们之前Android(java)学习笔记70中关于生产者和消费者程序思路: 2. 下面我们就要重点介绍这个等待唤醒机制: (1)第一步:还是先通过代码体现出等待唤醒机制 pac ...
- Android(java)学习笔记11:生产者和消费者之等待唤醒机制
1. 首先我们根据梳理我们之前Android(java)学习笔记70中,关于生产者和消费者程序思路: 2. 下面我们就要重点介绍这个等待唤醒机制: (1)第一步:还是先通过代码体现出等待唤醒机制 下面 ...
- Android(java)学习笔记267:Android线程池形态
1. 线程池简介 多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力. 假设一个服务器完成一项任务所需时间为:T1 创建线程时间, ...
- Android(java)学习笔记211:Android线程池形态
1. 线程池简介 多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力. 假设一个服务器完成一项任务所需时间为:T1 创建线程时间, ...
- java多线程学习笔记——详细
一.线程类 1.新建状态(New):新创建了一个线程对象. 2.就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行线程池中, ...
- 尚学堂JAVA基础学习笔记
目录 尚学堂JAVA基础学习笔记 写在前面 第1章 JAVA入门 第2章 数据类型和运算符 第3章 控制语句 第4章 Java面向对象基础 1. 面向对象基础 2. 面向对象的内存分析 3. 构造方法 ...
- 20145213《Java程序设计学习笔记》第六周学习总结
20145213<Java程序设计学习笔记>第六周学习总结 说在前面的话 上篇博客中娄老师指出我因为数据结构基础薄弱,才导致对第九章内容浅尝遏止地认知.在这里我还要自我批评一下,其实我事后 ...
随机推荐
- 《verilog数字系统设计教程》书评
这本书的确是一本很经典的关于verilog语法和一些基本概念的书籍,后面的例子也很好,但是对于初学者来说,我们需要掌握的是语法和一些基本的概念. 刚一开始这本书的中文语法有点不是很通顺,但是越是往后, ...
- 60.ISE PhysDesignRules ERROR
PhysDesignRules:2100 - Issue with pin connections and/or configuration on block:<U_ila_pro_0/U0/I ...
- Java 集合转换(数组、List、Set、Map相互转换)
转自:http://blog.csdn.net/top_code/article/details/10552827 package com.example.test; import java.util ...
- python中fork()函数生成子进程分析
python的os module中有fork()函数用于生成子进程,生成的子进程是父进程的镜像,但是它们有各自的地址空间,子进程复制一份父进程内存给自己,两个进程之 间的执行是相互独立的,其执行顺序可 ...
- 结队开发项目——七巧板NABC需求分析
NABC需求分析 我们团队项目为七巧板取了个洋气的名字叫7-magic. 怀念过去,把握现在,展望未来:立足经典,勇于创新,开创一个七巧板的新时代. 特点:可以保存图片或上传至微信平台 N ...
- mongodb修改器
mongodb修改器 转载自:http://blog.csdn.net/mcpang/article/details/7752736 mongodb修改器(\(inc/\)set/\(unset/\) ...
- Java缓冲流细节
FileOutPutStream继承OutputStream,并不提供flush()方法的重写所以无论内容多少write都会将二进制流直接传递给底层操作系统的I/O,flush无效果.而Buffere ...
- asp.net webservice 返回json数据乱码解决方法
[WebMethod] public void QueryRiskNotice(string phone) { try { var data = _riskNoticeDal.QueryRiskNot ...
- web开发--文档下载
GOOGLE在线文档下载地址分享(GOOGLE的文档地址暂不能用了,会放在其它位置..) GOOGLE的在线文档功能好象挂掉了...等找个其它存放的位置把这些文档再上传上去... 存在GOOGLE里面 ...
- ExtjsMVC开发过程中遇到的具体问题总结
1.登陆相关问题 1.如何在文本框中增加提示信息 2.如何在文本框中触发回车事件 3.如何在回车事件中触发按钮的动作 总结:ht ...