Java多线程wait,notify使用

  1. wait notify不是线程对象专有的,所有对象都有
  2. 在synchronized基础上使用
  3. list.wait()作用:使当前线程无限等待,并释放锁
  4. list.notify():不释放锁

先上个例子:

生产Producer和消费Consumer,生产一个产品,消费一个产品。
用List做仓库,生产一个添加到list,消费一个list去掉一个。

原理:

list作为仓库有两个池,锁池和等待池。线程进入锁池抢锁,进入等待池等待被唤醒。
1.消费线程和生产线程同时执行,假设消费线程首先抢到锁,执行run()方法,此时仓库list没有产品,执行list.wait()并释放锁,消费线程从而进入等待池,生产线程抢到锁
2.生产线程抢到锁后执行run()方法,仓库list没有产品,从而生产一个o,存入仓库list,并执行list.notify(),告知等待池中的一个线程-只有消费线程,从而消费线程进入锁池等待抢锁。生产线程继续执行,因为仓库有产品,执行list.wait(),释放锁进入等待池,消费线程抢到锁。
3.消费线程执行run(),消费产品,并执行list.notify(),再执行list.wait(),进入等待池并释放锁。
然后就这样一直生产,一直消费,代码如下

import java.util.*;

public class Main {
	
	public static void main(String[] args) {
        List list=new ArrayList();//相当于仓库
        Producer r1=new Producer(list);
        Consumer r2=new Consumer(list);
	    Thread t1=new Thread(r1,"生产");
        Thread t2=new Thread(r2,"消费");
        t1.start();
        t2.start();
        try {
            Thread.sleep(10);
            r1.isTrue=false;
            r2.isTrue=false;
        } catch (InterruptedException e) {}
    }
    
}
class Producer implements Runnable {
    private List list;
    public boolean isTrue=true;
    public Producer(List list){
        this.list=list;
    }
    @Override
    public void run() {
        while(isTrue){
            synchronized(list){
                if(list.size()<1){
                    Object o=new Object();
                    list.add(o);
                    System.out.println(Thread.currentThread().getName()+"--->"+"添加1个"+o);
                    list.notify();
                }
                try {
                    list.wait();
                } catch (InterruptedException e) {}
            }
            
        }
        
    }
}
class Consumer implements Runnable {
    private List list;
    public boolean isTrue=true;
    public Consumer(List list){
        this.list=list;
    }
    @Override
    public void run() {
        while(isTrue){
            synchronized(list){
                if(list.size()>0){
                    Object o=list.remove(0);
                    System.out.println(Thread.currentThread().getName()+"--->"+"减少1个"+o);
                    list.notify();
                }
                try {
                    list.wait();
                } catch (InterruptedException e) {}
            }

        }

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值