多线程——生产者/消费者问题
2012-04-12 23:16
134 查看
线程经典列子:
生产者、消费者问题:
废话不多说,直接上源码:
Wait sleep区别
³
来源不同
²
Sleep是Thread提供的方法
²
Wait继承自Object
³
代码位置不同
²
Wait需要写在Synchronize语句块里面
³
是否释放锁定对象
²
调用wait方法,释放锁定该对象
²
Sleep时别的线程也不可以访问锁定对象
生产者、消费者问题:
废话不多说,直接上源码:
publicclass ProducerConsumer { /** * @param args */ publicstaticvoid main(String[] args) { // TODO Auto-generated method stub SynStack ss=new SynStack(); Producer p=new Producer(ss); Consumer c=new Consumer(ss); new Thread(p).start(); new Thread(c).start(); } } class WoTo{ intid=0; public WoTo(int id) { // TODO Auto-generated constructor stub this.id=id; } @Override public String toString() {//重写toString方法。 // TODO Auto-generated method stub return"WoTo:"+id; } } class SynStack{ intindex=-0; WoTo[] arrWT=new WoTo[6]; publicsynchronizedvoid push(WoTo wt){//生产方法。 while(index==arrWT.length){//这里用while不用if??因为如果使用 //if的话当wait被打断的时候会发生异常,捕获异常后悔继续往下执行。 try { this.wait();//注意与sleep的区别。 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } this.notifyAll();//通知当前wait的一个线程执行。 arrWT[index]=wt; index++; System.out.println("生产了:"+wt); } publicsynchronized WoTo pop(){ while(index==0){ try { this.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } this.notifyAll(); index--; System.out.println("===消费了===:"+arrWT[index]); returnarrWT[index]; } } class Producer implements Runnable{ SynStack ss=null; public Producer(SynStack ss) { // TODO Auto-generated constructor stub this.ss=ss; } @Override publicvoid run() { // TODO Auto-generated method stub for(int i=0;i<20;i++){ WoTo wt=new WoTo(i); ss.push(wt); try { Thread.sleep((int)(Math.random()*1000)); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } class Consumer implements Runnable{ SynStack ss=null; public Consumer(SynStack ss) { // TODO Auto-generated constructor stub this.ss=ss; } @Override publicvoid run() { // TODO Auto-generated method stub for(int i=0;i<20;i++){ WoTo wt=ss.pop(); try { Thread.sleep((int)(Math.random()*1000)); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
Wait sleep区别
³
来源不同
²
Sleep是Thread提供的方法
²
Wait继承自Object
³
代码位置不同
²
Wait需要写在Synchronize语句块里面
³
是否释放锁定对象
²
调用wait方法,释放锁定该对象
²
Sleep时别的线程也不可以访问锁定对象
相关文章推荐
- 秒杀多线程第十篇 生产者消费者问题
- 多线程——生产者与消费者(多)问题解决
- Java多线程之生产者/消费者问题
- 多线程之生产者与消费者问题
- 秒杀多线程第十篇 生产者消费者问题
- 多线程之经典生产者消费者问题
- 用JAVA实现多线程(生产者与消费者问题)
- Java 多线程 生产者消费者问题
- 多线程问题(生产者和消费者)
- 多线程第八篇:生产者消费者问题
- 关于多线程的经典问题——生产者消费者,不能实现循环工作。
- .net实现--多线程之生产者/消费者问题
- Java多线程学习之生产者消费者问题(一)
- java多线程之生产者消费者经典问题
- JAVA学习第二十七课(多线程(六))- 多生产者多消费者问题(JDK1.5新特性)
- java多线程总结六:经典生产者消费者问题实现
- C++之多个生产者与多个消费者的多线程问题
- 秒杀多线程第十篇 生产者消费者问题
- Java——生产者消费者中多线程安全问题
- 用多线程实现“生产者-消费者问题”(代码+实验报告)