线程协作
这种协作是通过线程之间的握手来实现的,这种握手可以通过Object的wait()和notify()来安全的实现
1.1生产者和消费者的问题
有一家汉堡店举办吃汉堡比赛,决赛时有3个顾客来吃,3个厨师来做,一个服务员负责协调汉堡的数量。为了避免浪费,制作好的汉堡被放进一个能装有10个汉堡的长条状容器中,按照先进先出的原则取汉堡。如果容器被装满,则厨师停止做汉堡,如果顾客发现容器内的汉堡吃完了,就可以拍响容器上的闹铃,提醒厨师再做几个汉堡出来。此时服务员过来安抚顾客,让他等待。而一旦厨师的汉堡做出来,就会让服务员通知顾客,汉堡做好了,让顾客继续过来取汉堡。
顾客其实就是我们所说的消费者,而厨师就是生产者。
public class Demo04_生成者消费者 {
public static void main(String[] args) {
new Producer().start();
new Consumer().start();
}
private static List<Integer> hamburgers = new ArrayList<Integer>();
private static class Producer extends Thread{ //生产者
int i=0;
public void run() {
while(true){
if(hamburgers.size()<10){
hamburgers.add(i); // 生产
System.out.println("生产汉堡: "+i);
i++;
synchronized (hamburgers) {
hamburgers.notifyAll();
}
}else{
synchronized (hamburgers) {
try {
hamburgers.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
private static class Consumer extends Thread{//消费者
public void run() {
while(true){
if(hamburgers.size()>0){
System.out.println("消费汉堡: "+hamburgers.remove(0)); // 消费
synchronized (hamburgers) {
hamburgers.notifyAll();
}
}else{
synchronized (hamburgers) {
try {
hamburgers.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
sleep和wait的区别:
sleep:让线程睡眠指定时间,不释放锁
wait:让线程处于等待状态,释放锁
notify只能唤醒处于wait状态的线程,不能唤醒sleep状态的线程