您当前的位置: 首页 > 

Dongguo丶

暂无认证

  • 2浏览

    0关注

    472博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

线程间通信Object的waitnotify

Dongguo丶 发布时间:2021-09-10 15:21:09 ,浏览量:2

wait/notify等待通知方式

等待通知机制就是将处于等待状态的线程将由其它线程发出通知后重新获取CPU资源,继续执行之前没有执行完的任务。最典型的例子生产者–消费者模式

image-20210903132410512

生产者想要在队列中添加产品,消费者需要从队列中取出产品,如果队列为空,消费者应该等待生产者添加产品后才进行消费,队列为满时,生产者需要等待消费者消费一部分产品后才能继续生产。队列可以认为是java模型里的临界资源,生产者和消费者认为是不同的线程,它们需要交替的占用临界资源来进行各自方法的执行,所以就需要线程间通信。

等待/通知机制主要提供了三个方法用于线程间的通信

wait()当前线程释放锁并进入等待(阻塞)状态

notify()唤醒一个正在等待相应对象锁的线程,使其进入就绪队列,以便在当前线程释放锁后继续竞争锁

notifyAll()唤醒所有正在等待相应对象锁的线程,使其进入就绪队列,以便在当前线程释放锁后继续竞争锁

等待/通知机制是指一个线程A调用了对象Object的wait()方法进入等待状态,而另一线程B调用了对象Object的notify()或者notifyAll()方法,当线程A收到通知后就可以从对象Object的wait()方法返回,进而执行后序的操作。线程间的通信需要对象Object来完成,对象中的wait()、notify()、notifyAll()方法就如同开关信号,用来完成等待方和通知方的交互。

等待/通知的相关方法:

image-20210910103119062

实例

场景—两个线程,一个线程对当前数值加1,另一个线程对当前数值减1,一共执行10次

假设这个共享变量的初始值为0,一个线程t1对值+1,另一个线程t2对值-1.

package com.dongguo.concurrent.waitnotify;

/**
 * @author Dongguo
 * @date 2021/9/3 0003-13:15
 * @description: 生产者消费者
 * 场景---两个线程,一个线程对当前数值加1,另一个线程对当前数值减1,一共执行10次
 * 假设这个共享变量的初始值为0,一个线程对值+1,另一个线程对值-1.
 */
public class ThreadWaitNotifyDemo {
    public static void main(String[] args) {
        Number number = new Number();
        new Thread(() -> {
            for (int i = 0; i  {
            for (int i = 0; i             
关注
打赏
1638062488
查看更多评论
0.0435s