Java-J2SE学习笔记-线程-生产者消费者问题
2015-06-29 11:28
831 查看
一、概述
模拟生产者消费者问题
二、代码
1.Consumer.java
2.Producer.java
3.SyncStack.java
4.Test.java
1.Consumer.java
2.Producer.java
3.SyncStack.java
4.Test.java
三、运行结果
四、小结
1.this.wait(),保有先锁定,才能调用wait,wait是使正在访问本对象的线程wait,且wait后此线程的锁会丢失,只有当线程醒来后才会再去找回锁。sleep则锁不会丢失。
2.this.notify()唤醒一个正在wait当前对象上的一个线程
模拟生产者消费者问题
二、代码
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当前对象上的一个线程
相关文章推荐
- 【原创】环境变量path里的<java path>项被其他程序QJ后的办法
- LeetCode_65---Valid Number
- java学习——equals()和==的比较
- LeetCode_64---Minimum Path Sum
- eclipse利用maven创建Sevlet3.0项目
- Java getResourceAsStream() 方法会缓存文件的问题
- Spring注解
- Java map排序(TreeMap,LinkedHashMap)
- spring mvc与struts的区别
- 【Spring学习笔记-MVC-13】Spring MVC之文件上传
- Java反射机制(以数据库读取为例)
- java 访问url
- spring mvc DispatcherServlet详解之前传---前端控制器架构
- java swing实现简单图片显示(测试生成图片快捷方式)
- Java多态的内存分析——高淇Java300学习笔记
- 《Java程序设计》第16周周五:数据库连接 与 随机数的使用
- struts2上传工具类
- Myeclipse安装配置优化
- Java读书笔记二(封装类)
- java 单链集合实现