• java进阶(40)--wait与notify(生产者与消费者模式)


    文档目录:

    一、概念

    二、wait的作用

    三、notify的作用

    四、生产者消费者模式

    五、举例

    ---------------------------------------分割线:正文--------------------------------------------------------

    一、概念

    1、wait与notify为Object类自带,可用户任意的对象

    2、wait的作用

    o.wait()表示让正在o对象上的活动线程进入等待状态,无期限等待,直到被唤醒为止,释放o线程的锁

    3、notify的作用

    o.notify()表示让o对象上等待的线程唤醒,只通知,不释放对象的锁

     

    二、生产者消费者模式

    1、含义:

    一个线程负责生产,一个线程负责消费,为达到生产与消费均衡

    2、注意事项:

    仓库是多线程共享的,仓库的对象最终调用wait与notify方法,建立在synchronized线程同步机制的基础上

     

    三、举例:使用wait与notify方法实现生产者与消费者模式

     1 package com.bk.java.Test40_ProducerAndCousumer;
     2 
     3 import java.util.ArrayList;
     4 import java.util.List;
     5 
     6 public class ThreadTest {
     7     public static void main(String[] args) {
     8         //创建仓库对象
     9         List list=new ArrayList();
    10         //创建线程对象:生产者与消费者
    11         Thread t1=new Thread(new Producer(list));
    12         Thread t2=new Thread(new Consumer(list));
    13         t1.setName("生产者");
    14         t2.setName("消费者");
    15         t1.start();
    16         t2.start();
    17     }
    18 }
    19 class Producer implements  Runnable{
    20     //创建仓库
    21     private List list;
    22     public Producer(List list)
    23     {
    24         this.list=list;
    25     }
    26     @Override
    27     public void run() {
    28         while (true){
    29             synchronized (list){
    30                 if(list.size()>0){
    31                     try {
    32                         list.wait();
    33                     } catch (InterruptedException e) {
    34                         e.printStackTrace();
    35                     }
    36                 }
    37                 //仓库为空,永久生产
    38                 Object obj=new Object();
    39                 list.add(obj);
    40                 System.out.println(Thread.currentThread().getName()+"------->"+obj);
    41                 //唤醒消费者
    42                 list.notify();
    43             }
    44         }
    45 
    46     }
    47 }
    48 class Consumer implements  Runnable{
    49     //创建仓库
    50     private List list;
    51     public Consumer(List list)
    52     {
    53         this.list=list;
    54     }
    55     @Override
    56     public void run() {
    57         while (true){
    58             synchronized (list){
    59                 if(list.size()==0){
    60                     //仓库空了
    61                     try {
    62                         list.wait();
    63                     } catch (InterruptedException e) {
    64                         e.printStackTrace();
    65                     }
    66                 }
    67                 Object obj=list.remove(0);
    68                 System.out.println(Thread.currentThread().getName()+"------->"+obj);
    69                 //唤醒生产者
    70                 list.notify();
    71             }
    72         }
    73 
    74     }
    75 }

    查看执行结果-片段:

    消费者------->java.lang.Object@214bb29b
    生产者------->java.lang.Object@17a03a96
    消费者------->java.lang.Object@17a03a96
    生产者------->java.lang.Object@767b0dec
    消费者------->java.lang.Object@767b0dec
    生产者------->java.lang.Object@1d8a042
    消费者------->java.lang.Object@1d8a042
    生产者------->java.lang.Object@7d7b1588
    消费者------->java.lang.Object@7d7b1588
    生产者------->java.lang.Object@6b19e43b
  • 相关阅读:
    java 字符串split有很多坑,使用时请小心!!
    Java并发编程:线程池的使用
    java自带线程池和队列详细讲解
    merge into的用法
    Oracle中如何使用REGEXP_SUBSTR函数
    oracle分组统计某列逗号隔开数据
    oracle一列中的数据有多个手机号码用逗号隔开,我如何分别取出来?
    css box-shadow使用---转
    201706问题记录
    201705问题记录
  • 原文地址:https://www.cnblogs.com/mrwhite2020/p/14608878.html
Copyright © 2020-2023  润新知