有成功案例的网站,客户评论 网站建设,群晖装wordpress,兴平市住房和城乡建设局门户网站4、关于 Object 类中的 wait 和 notify 方法。#xff08;生产者和消费者模式#xff01;#xff09; 第一#xff1a;wait 和 notify 方法不是线程对象的方法#xff0c;是 java 中任何一个 java 对象都有的方法#xff0c;因为这两个方法是 Object 类中自带的。 wait 方…4、关于 Object 类中的 wait 和 notify 方法。生产者和消费者模式 第一wait 和 notify 方法不是线程对象的方法是 java 中任何一个 java 对象都有的方法因为这两个方法是 Object 类中自带的。 wait 方法和 notify 方法不是通过线程对象调用的。 第二wait() 方法作用 Object o new Object(); o.wait(); 表示让正在 o 对象上活动的线程进入等待状态无期限等待直到被唤醒为止。 o.wait(); 方法的调用会让“当前线程正在 o 对象上活动的线程”进入等待状态。 第三notify方法作用 Object o new Object(); o.notify(); 表示唤醒正在 o 对象上等待的线程。
notifyAll() 方法
这个方法是唤醒 o 对象上处于等待的所有线程。例 package com.su.test.threadtest;
import java.util.ArrayList; import java.util.List;
/**
author : sumeipingdate : 2022-02-01 16:411、使用 wait 方法和 notify 方法实现“生产者和消费者模式”2、什么是“生产者和消费者模式” 生产线程负责生产消费线程负责消费。生产线程和消费线程要达到均衡。这是一种特殊的业务需求在这种特殊的情况下要使用 wait 方法和 notify 方法。3、wait 和 notify 方法不是线程对象的方法是普通 java 对象都有的方法。java.lang.Object 根类4、wait 方法和 notify 方法建立在线程同步的基础之上。因为多线程要同时操作一个仓库。有线程安全问题。5、wait 方法作用o.wait() 让正在 o 对象上活动的线程 t 进入等待状态并且释放掉 t 线程之前占有的 o 对象的锁。6、notify 方法作用o.notify() 让正在 o 对象上等待的线程唤醒只是通知不会释放 o 对象上之前占有的锁。7、模拟这样一个需求 仓库我们采用 List 集合。List 集合中假设只能存储 1 个元素。1 个元素就表示仓库满了。如果 List 集合中元素个数是 0就表示仓库空了。保证 List 集合中永远都是最多存储 1 个元素。必须做到这种效果生产 1 个消费 1 个。*/ public class WaitNotify { public static void main(String[] args) { // 创建一个仓库对象共享的。 List list new ArrayList(); // 创建2个线程对象// 生产者线程对象Thread t1 new Thread(new Producer(list));t1.setName(生产者线程);// 消费者线程对象Thread t2 new Thread(new Consumer(list));t2.setName(消费者线程);// 启动线程t1.start();t2.start();/*** 生产者线程---java.lang.Object47a2a66c* 消费者线程---java.lang.Object47a2a66c* 仓库已经空了* 生产者线程---java.lang.Object496550e8* 消费者线程---java.lang.Object496550e8* 仓库已经空了* 生产者线程---java.lang.Object4d5acd1c* 仓库已经有1个元素了* 消费者线程---java.lang.Object4d5acd1c* 仓库已经空了* 生产者线程---java.lang.Object8585ad3* 仓库已经有1个元素了* 消费者线程---java.lang.Object8585ad3* 生产者线程---java.lang.Object5a9b1c72* 消费者线程---java.lang.Object5a9b1c72* 生产者线程---java.lang.Object399af5d9* 仓库已经有1个元素了* 消费者线程---java.lang.Object399af5d9* 生产者线程---java.lang.Object22b3eddb* 仓库已经有1个元素了* 消费者线程---java.lang.Object22b3eddb* 仓库已经空了* 生产者线程---java.lang.Object6877a59c* ..........*/
}} // 生产线程 class Producer implements Runnable{ // 仓库 private List list; public Producer(){}
public Producer(List list) {this.list list;
}Override
public void run() {// 一直生产使用死循环来模拟一直生产while (true){// 给仓库对象list加锁synchronized (list){if (list.size() 0){ // 大于 0说明仓库中已经有 1 个元素了。System.out.println(仓库已经有1个元素了);try {list.wait(); // 当线程进入等待状态并且释放 Producer 之前占有的 list 集合的锁。} catch (InterruptedException e) {e.printStackTrace();}}// 程序执行到这来说明仓库是空的可以生产Object obj new Object();list.add(obj);System.out.println(Thread.currentThread().getName() --- obj);try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}// 唤醒消费者进行消费//list.notify();list.notifyAll();}}
}} // 消费线程 class Consumer implements Runnable{ private List list; public Consumer(){}
public Consumer(List list){this.list list;
}Override
public void run() {// 一直消费while (true){synchronized (list){if (list.size() 0){System.out.println(仓库已经空了);try {list.wait(); // 仓库已经空了。消费者线程等待释放掉 list 集合的锁} catch (InterruptedException e) {e.printStackTrace();}}// 程序执行到这里说明仓库中有数据可以消费Object obj list.remove(0);System.out.println(Thread.currentThread().getName() --- obj);try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}// 唤醒生产者进行生产//list.notify();list.notifyAll();}}
}}