package com.qianfeng.day22_Thread;
/*
* 1: 一个生产者和一个消费者,包子只能有一个。
* 一个线程生产一个包子。
* 一个线程消费一个包子。
* 2:wait方法和sleep方法的区别:
* 1:wait方法会释放锁,sleep方法不会释放锁。
* 2:wait必须放在同步中,sleep不一定放在同步中.
* 3:wait一般的情况是让对方唤醒。sleep通常会自己醒过来。
* 4:wait需要用锁去调用。sleep是用Thread类或者Thread对象来调用。
* 3: 一个生产者和一个消费者,包子只能有6个.
*
*/
public class Demo01 {
public static void main(String[] args) {
Product p_product = new Product();
p_product.setName("生产者");
Customer c_customer = new Customer();
c_customer.setName("消费者");
p_product.start();
c_customer.start();
}
}
// 包子
class Baozi {
public static boolean flag; // false 表示沒有包子,true表示有包子
public static Object obj = new Object(); // 锁
}
// 生产者
class Product extends Thread {
@Override
public void run() {
while (true) {
synchronized (Baozi.obj) {
if (Baozi.flag) {
// 表示有包子,等着消费者消费,生产者应该等待,需要用锁去调用wait方法
try {
Baozi.obj.wait(); // 等待
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Baozi.flag = true; // 生产包子
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "生产了一个包子");
Baozi.obj.notify(); // 唤醒消费者
}
}
}
}
// 消费者
class Customer extends Thread {
@Override
public void run() {
while (true) {
synchronized (Baozi.obj) {
if (!Baozi.flag) {
try {
Baozi.obj.wait(); // 等待
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// 否则的话,可以消费
Baozi.flag = false;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "消费了一个包子");
Baozi.obj.notify(); // 唤醒生产者可以生产了
}
}
}
}
/*
* 1: 一个生产者和一个消费者,包子只能有一个。
* 一个线程生产一个包子。
* 一个线程消费一个包子。
* 2:wait方法和sleep方法的区别:
* 1:wait方法会释放锁,sleep方法不会释放锁。
* 2:wait必须放在同步中,sleep不一定放在同步中.
* 3:wait一般的情况是让对方唤醒。sleep通常会自己醒过来。
* 4:wait需要用锁去调用。sleep是用Thread类或者Thread对象来调用。
* 3: 一个生产者和一个消费者,包子只能有6个.
*
*/
public class Demo01 {
public static void main(String[] args) {
Product p_product = new Product();
p_product.setName("生产者");
Customer c_customer = new Customer();
c_customer.setName("消费者");
p_product.start();
c_customer.start();
}
}
// 包子
class Baozi {
public static boolean flag; // false 表示沒有包子,true表示有包子
public static Object obj = new Object(); // 锁
}
// 生产者
class Product extends Thread {
@Override
public void run() {
while (true) {
synchronized (Baozi.obj) {
if (Baozi.flag) {
// 表示有包子,等着消费者消费,生产者应该等待,需要用锁去调用wait方法
try {
Baozi.obj.wait(); // 等待
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Baozi.flag = true; // 生产包子
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "生产了一个包子");
Baozi.obj.notify(); // 唤醒消费者
}
}
}
}
// 消费者
class Customer extends Thread {
@Override
public void run() {
while (true) {
synchronized (Baozi.obj) {
if (!Baozi.flag) {
try {
Baozi.obj.wait(); // 等待
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// 否则的话,可以消费
Baozi.flag = false;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "消费了一个包子");
Baozi.obj.notify(); // 唤醒生产者可以生产了
}
}
}
}