感悟: 生产者和消费者其实就是一个很简单的一个多线程同步的例子,但是我却花了好多天才能理解。反思下来就是缺乏实践,这听起来感觉很简单的一个道理,但是能做到可就很难了。当初在看这个生产者和消费者实例的时候,看着感觉代码能简单,大致上能理解,但是到了转天自己却又写不出来了,才知道是自己还没有理解透彻。现在动了一次手实践一番以后,不说理解透彻,理解个90%还是没问题的。
基础准备: notify()是Object类的一个方法,其作用在java-api中说到,唤醒在此对象监视器上等待的单个线程,之前一直理解为哪个线程调用的该方法就唤醒哪个线程,这就大错特错了。
代码实现:
这里模拟的是生产者生产苹果,放在公共的盒子上,消费者从公共的盘子上获取水果。
先写个公共盘子类PublicBox:
package ThreadProducerAndConsumer;
/**
* 公共的盒子
* Created by Curtain on 2018/9/24.
*/
public class PublicBox {
private int apple = 0;
//增加苹果的方法
public synchronized void increace(){
while (apple == 5){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
apple++;
System.out.println("生成苹果成功!");
notify();
}
public synchronized void decreace(){
while (apple == 0){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
apple--;
System.out.println("消费苹果成功!");
notify();
}
}
写个生产者类Producer:
package ThreadProducerAndConsumer;
/**
* 生产者(定义10次)
* Created by Curtain on 2018/9/24.
*/
public class Producer implements Runnable{
private PublicBox box;
public Producer(PublicBox box){
this.box = box;
}
@Override
public void run() {
//生产10次苹果
for (int i = 0; i < 10; i++){
try {
System.out.println("pro i:" + i);
Thread.sleep(30);
} catch (InterruptedException e) {
e.printStackTrace();
}
box.increace();
}
}
}
写个消费者类Consumer:
package ThreadProducerAndConsumer;
/**
* 消费者
* Created by Curtain on 2018/9/24.
*/
public class Consumer implements Runnable{
private PublicBox box;
public Consumer(PublicBox box){
this.box = box;
}
@Override
public void run() {
for (int i = 0; i < 10; i++){
System.out.println("con i:" + i);
try {
Thread.sleep(30);
} catch (InterruptedException e) {
e.printStackTrace();
}
box.decreace();
}
}
}
最后就是测试类:
package ThreadProducerAndConsumer;
/**
* 生产和和消费者测试
* Created by Curtain on 2018/9/24.
*/
public class Test01 {
public static void main(String[] args) {
PublicBox box = new PublicBox();
Consumer con = new Consumer(box);
Producer pro = new Producer(box);
Thread t1 = new Thread(con);
Thread t2 = new Thread(pro);
t1.start();
t2.start();
}
}
运行结果: