多线程-生产者和消费者问题
生产者和消费者问题
生产者和消费者的问题是一个线程通信的例子。
比如买馒头,需要先进行生产,生产了就通知消费者来吃馒头。如果馒头没了就通知生产者继续生产。
public class Test {
public static void main(String[] args) {
Click click = new Click(0);
new Thread(new Productor(click),"生产").start();
new Thread(new Consumer(click),"消费").start();
}
}
//生产者
class Productor implements Runnable{
private Click click;
Productor(Click click){
this.click = click;
}
@Override
public void run() {
while (true){
synchronized (click) {
if (click.num < 10) {
click.num++;
System.out.println(Thread.currentThread().getName() + "第:" + click.num + "个商品");
click.notify();
} else {
try {
click.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
//消费者
class Consumer implements Runnable{
private Click click;
Consumer(Click click){
this.click = click;
}
@Override
public void run() {
while (true) {
synchronized (click) {
if (click.num > 0) {
System.out.println(Thread.currentThread().getName() + "第:" + click.num + "个商品");
click.num--;
click.notify();
} else {
try {
click.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
//馒头店
class Click{
int num;
Click(int num){
this.num = num;
}
}
运行结果:
这里需要注意synchronized的锁对象应该是馒头店,不能是this。因为馒头店只有一个,而this指当前对象,生产者和消费者都创建了,所以使用this不行。
有道无术,术可求;有术无道,止于术。