您的位置:首页 > 其它

多线程——生产者/消费者问题

2012-04-12 23:16 134 查看
线程经典列子:
生产者、消费者问题:
废话不多说,直接上源码:
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时别的线程也不可以访问锁定对象
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: