线程经典列子:
生产者、消费者问题:
废话不多说,直接上源码:
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时别的线程也不可以访问锁定对象