/**
产者和消费者
关于Object类中的wait和notify方法。
第一:wait和notify方法不是线程对象的方法,是java中任何一个java对象
都有的方法,因为这两个方式是Object类中自带的。
wait方法和notify方法不是通过线程对象调用,
不是这样的:t.wait(),也不是这样的:t.notify()..不对。
第二:wait()方法作用:
?Object o = new Object();
?o.wait();
表示:
让正在o对象上活动的线程进入等待状态,无期限等待,
直到被唤醒为止。
o.wait();方法的调用,会让“当前线程(正在o对象上
活动的线程)”进入等待状态。
第三:notify()方法作用:
?Object o = new Object();
?o.notify();
表示:
唤醒正在o对象上等待的线程。
还有一个notifyAll()方法:
这个方法是唤醒o对象上处于等待的所有线程。
注意:wait方法和notify方法需要建立在synchronized线程同步的基础之上。
重点:o.wait()方法会让正在o对象上活动的当前线程进入等待状态,并且释放之前占有的o对象的锁;
o.notify()方法只会通知,不会释放之前占有的o对象的锁。
生产者和消费者模式
生产者与消费者模式是并发、多线程编程中经典的设计模式,通过wait和notifyAll方法实现。
例如:生产满了,就不能继续生产了,必须让消费线程进行消费。
消费完了,就不能继续消费了,必须让生产线程进行生产。
而消费和生产者共享的仓库,就为多线程共享的了,所以需要考虑仓库的线程安全问题。
wait方法和notify方法建立在线程同步的基础之上。因为多线程要同时操作一个仓库。有线程安全问题。
wait方法作用:o.wait()让正在o对象上活动的线程t进入等待状态,并且释放掉t线程之前占有的o对象的锁。
notify方法作用:o.notify()让正在o对象上等待的线程唤醒,只是通知,不会释放o对象上之前占有的锁。
?*/
public class MyWait2 {
????public static void main(String[] args) {
//创建1个仓库对象,共享的。
????????List list = new ArrayList();
//创建两个线程对象
//生产者线程
????????Thread t1 = new Thread(new Producer2(list));
//消费者线程
????????Thread t2 = new Thread(new Consumer2(list));
t1.setName("生产者线程");
t2.setName("消费者线程");
????????t1.start();
????????t2.start();
????}
}
//生产线程
class Producer2 implements Runnable {
//仓库
????private List list;
????public Producer2(List list) {
????????this.list = list;
????}
????@Override
????public void run() {
//一直生产(使用死循环来模拟一直生产)
????????while(true){
//给仓库对象list加锁。
????????????synchronized (list){
if(list.size() > 0){ //大于0,说明仓库中已经有1个元素了。
????????????????????try {
//当前线程进入等待状态,并且释放Producer之前占有的list集合的锁。
????????????????????????list.wait();
????????????????????} catch (InterruptedException e) {
????????????????????????e.printStackTrace();
????????????????????}
????????????????}
//程序能够执行到这里说明仓库是空的,可以生产
????????????????Object obj = new Object();
????????????????list.add(obj);
????????????????System.out.println(Thread.currentThread().getName() + "--->" + obj);
//唤醒消费者进行消费
????????????????list.notifyAll();
????????????}
????????}
????}
}
//消费线程
class Consumer2 implements Runnable {
//仓库
????private List list;
????public Consumer2(List list) {
????????this.list = list;
????}
????@Override
????public void run() {
//一直消费
????????while(true){
????????????synchronized (list) {
????????????????if(list.size() == 0){
????????????????????try {
//仓库已经空了。
//消费者线程等待,释放掉list集合的锁
????????????????????????list.wait();
????????????????????} catch (InterruptedException e) {
????????????????????????e.printStackTrace();
????????????????????}
????????????????}
//程序能够执行到此处说明仓库中有数据,进行消费。
????????????????Object obj = list.remove(0);
????????????????System.out.println(Thread.currentThread().getName() + "--->" + obj);
//唤醒生产者生产。
????????????????list.notifyAll();
????????????}
????????}
????}
}