`
xyheqhd888
  • 浏览: 409267 次
  • 性别: Icon_minigender_1
  • 来自: 秦皇岛
社区版块
存档分类
最新评论

wait()和notify()

阅读更多

1.  wait()、notify()、notifyAll()方法是由Object类提供的方法,且都被声明为final,所以无法重新定义它们。通过这3个方法您可以要求线程进入等待,或者是通知线程回到Runnable状态。

2.  必须在被同步化的方法或区块中调用wait()方法,当对象的wait()方法被调用时,当前的线程会被放入对象的等待集合(Wait Set)中,线程会解除对对象的锁定,其他的纯种可竞争执行被同步化区块。被放在等待集合中的线程将不参与线程的排队,wait()可以指定等待的时间,如果指定时间,则时间到之后线程会再度加入排队,如果指定时间为0或者不指定,则线程会持续等待,直到被中断,或是被告知参与排队。

3. 当对象的notify()被调用时,它会从当前对象的等待集中通知一个线程加入排队。被通知的线程是随机的,被通知的线程会与其他正在执行的线程共同竞争对对象的锁定。如果调用notifyAll(),则所有在等待集中的线程都会被通知加入排队,这些线程会与其他正在执行的线程共同竞争对对象的锁定。

4.当线程调用到对象的wait()方法时,表示它要先让出对象的被同步区使用权并等待通知,或是等待一段指定的时间,直到被通知或时间到时再与其他线程竞争。如果可以执行时应从等待点开始执行。

5.生产者消费者实例:生产者--店员--消费者。店员一次只能拥有固定数量的产品,若生产者生产了过多的产品,店员叫生产者等一下,如果店中有空位放产品了再通知生产者继续生产,如果店中没有产品了,店员会告诉消费者等一下,如果有产品了再通知消费者来取走产品。

package ysu.hxy;

/*
* 店员类
*
*/
public class Clerk
{
	//-1表示目前没有产品
	private int product = -1;

	//这个方法由生产者调用
	public synchronized void setProduct(int product)
	{
		if(this.product != -1)
		{
			try
			{
				//目前店员没有空间收产品,请稍候!
				wait();
			}
			catch(InterruptedException e)
			{
				e.printStackTrace();
			}
		}

		this.product = product;
        System.out.printf("生产者设定(%d)%n",this.product);

		//通知等待区中的一个消费者可以继续工作了
		notify();
	}

	//这个方法由消费者调用
	public synchronized int getProduct()
	{
		if(this.product == -1)
		{
			try
			{
				//缺货了,请稍候
				wait();
			}catch(InterruptedException e)
			{
				e.printStackTrace();
			}
		}

		int p = this.product;
        System.out.printf("消费者取走(%d)%n",this.product);
		this.product = -1;

		//通知等待区中的一个生产者可以继续工作了
		notify();

		return p;
	}
}

 

package ysu.hxy;

public class Producer implements Runnable
{
	private Clerk clerk;

	public Producer(Clerk clerk)
	{
		this.clerk = clerk;
	}

	public void run()
	{
		System.out.println("生产者开始生产整数......");

		//生产1到10的整数
		for(int product = 1;product <= 10;product++)
		{
           try
			{
			   //暂停随机时间
			   Thread.sleep((int)Math.random() * 3000);
			}
		   catch(InterruptedException e)
			{
			   e.printStackTrace();
			}

			//将产品交给店员
			clerk.setProduct(product);
		}
	}
}

 

package ysu.hxy;

public class Consumer implements Runnable
{
	private Clerk clerk;

    public Consumer(Clerk clerk)
	{
		this.clerk = clerk;
	}

	public void run()
	{
		System.out.println("消费者开始消耗整数......");

		//消耗10个整数
		for(int i=1;i<=10;i++)
		{
			try
			{
				//等待随机时间
				Thread.sleep((int)Math.random()*3000);
			}
			catch(InterruptedException e)
			{
				e.printStackTrace();
			}

			//从店员处取走整数
			clerk.getProduct();
		}
	}
}

 下面编写范例来测试生产者、消费者与店员的行为。

package ysu.hxy;

public class ProductTest
{
	public static void main(String[] args) 
	{
		Clerk clerk = new Clerk();

		//生产者线程
		Thread producerThread = new Thread(new Producer(clerk));

		//消费者线程
		Thread consumerThread = new Thread(new Consumer(clerk));

		producerThread.start();
		consumerThread.start();
	}
}

 执行结果如下:

                                D:\hxy>java ysu.hxy.ProductTest
                                生产者开始生产整数......
                                消费者开始消耗整数......
                                生产者设定(1)
                                消费者取走(1)
                                生产者设定(2)
                                消费者取走(2)
                                生产者设定(3)
                                消费者取走(3)
                                生产者设定(4)
                                消费者取走(4)
                                生产者设定(5)
                                消费者取走(5)
                                生产者设定(6)
                                消费者取走(6)
                                生产者设定(7)
                                消费者取走(7)
                                生产者设定(8)
                                消费者取走(8)
                                生产者设定(9)
                                消费者取走(9)
                                生产者设定(10)
                                消费者取走(10)

   生产者会生产10个整数,而消费者会消耗10个整数。由于店员处只能放置一个整数,所以只能每生产一个就消耗一个。

   如果一个线程进入对象的等待集中,可以中断它的等待,这时将会发生InterruptedException异常。可以使用线程对象的interrupt()方法来中断等待的动作。

分享到:
评论

相关推荐

    wait和notify讲解

    wait和notify讲解

    Java 同步方式 wait和notify/notifyall

    在Java中,`wait()`, `notify()`, 和 `notifyAll()` 是Java Object类的三个方法,它们在实现线程间通信和协作时扮演着关键角色。这些方法主要用于解决线程等待和唤醒的问题,是基于Java Monitor(监视器)模型的。 ...

    java之wait,notify的用法([ 详解+实例 ])

    Java之wait和notify的用法详解 在Java多线程编程中,wait和notify是两个非常重要的方法,它们都是Object类的方法,用于线程之间的通信和同步。下面我们将详细解释wait和notify的用法。 wait方法 wait方法是Object...

    Java多线程wait和notify

    在Java中,`wait()` 和 `notify()` 方法是实现线程间通信和协作的重要工具,它们属于 `java.lang.Object` 类,这意味着所有类都默认继承了这两个方法。本文将详细探讨如何使用 `wait()` 和 `notify()` 来控制子线程...

    JAVAWAIT和NOTIFY的用法.pdf

    JAVAWAIT和NOTIFY的用法.pdf

    Java的sychronized、wait和notify范例

    `synchronized`关键字、`wait()`和`notify()`方法是Java多线程中用于控制并发访问共享资源的重要工具,它们是Java内存模型(JMM)的一部分,主要用于解决线程间的同步问题。 一、`synchronized`关键字 `...

    java-wait和notify的用法.pdf

    在Java编程语言中,`wait()`和`notify()`是Object类中的两个关键方法,它们用于线程间的协作和通信。这两个方法在多线程环境下尤其重要,因为它们允许线程等待特定条件并通知其他线程继续执行。在分析给定的程序之前...

    java中几个notify、wait使用实例

    为了实现这一点,我们可以使用`wait()`和`notify()`来控制线程的执行顺序。具体实现如下: 1. 在每个线程中,使用`synchronized`关键字锁定同一个对象。 2. 当一个线程完成其打印任务后,调用`notify()`方法唤醒另...

    一个理解wait()与notify()的例子

    ### 一个理解wait()与notify()的例子 #### 知识点概述 本文旨在解析一个具体的Java多线程示例代码,以帮助读者更好地理解`wait()`与`notify()`方法的作用及其实现机制。这两个方法是Java中实现线程间通信的重要...

    wait()、notify()和notifyAll()方法1---马克-to-win java视频

    wait()、notify()和notifyAll()方法1---马克-to-win java视频

    java线程-保护性暂停(wait,notify实现).docx

    本文将详细讲解 Java 线程中的保护性暂停机制,即 wait 和 notify 方法的实现。在 Java 中,线程之间的通信是一个非常重要的课题,而保护性暂停机制正是解决线程之间通信的关键所在。 首先,让我们来看一下上述场景...

    wait_notify_demo

    `wait()`、`notify()`和`notifyAll()`是Java中的三个关键字,它们属于Object类的方法,主要用于线程间的通信,尤其在实现生产者消费者模式时发挥着重要作用。本文将深入探讨这些方法以及如何在实际场景中应用它们。 ...

    55.Lock-ReentranLock-使用RenntranLock实现wait和notify.mp4

    在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。

    浅谈java多线程wait,notify

    在Java多线程编程中,wait和notify是两个非常重要的机制,用于实现线程之间的通信和同步。在本文中,我们将通过示例代码详细介绍Java多线程wait和notify的使用,帮助读者更好地理解和掌握这两个机制。 wait机制 在...

    深入理解Wait、Notify和Wait与sleep区别

    首先,`wait()`, `notify()`和`notifyAll()`是Object类中的方法,它们主要用于线程间通信和协作。这些方法只能在同步环境中(如`synchronized`块或方法)使用,否则会抛出`IllegalMonitorStateException`。它们的...

    详细分析java线程wait和notify

    Java中的`wait()`和`notify()`方法是多线程编程中的关键工具,用于线程间的同步和通信。这两个方法都是Object类的成员,这意味着所有Java对象都可以使用它们。`wait()`方法使当前线程暂停执行并释放它持有的锁,直到...

    如何在Java中正确使用 wait, notify 和 notifyAll

    wait, notify 和 notifyAll,这些在多线程中被经常用到的保留关键字,在实际开发的时候很多时候却并没有被大家重视。本文对这些关键字的使用进行了描述。  在 Java 中可以用 wait、notify 和 notifyAll 来实现...

    Object类wait及notify方法原理实例解析

    Object类中的wait和notify方法是Java多线程编程中最重要的同步机制之一,它们是Java.lang.Object类中的两个方法,用于在多线程之间进行通信和同步。wait方法将当前线程置于等待状态,而notify方法则用于唤醒等待的...

    Java wait和notify虚假唤醒原理

    Java中的`wait()`和`notify()`是用于多线程同步的关键方法,它们是Object类的成员,因此所有Java对象都可以调用。这两个方法是Java内存模型(JMM)的一部分,用于控制线程间的协作和通信。 `wait()`方法使得当前...

    主线程去控制子线程wait与notify

    在Java多线程编程中,`wait()`和`notify()`是两个非常重要的方法,它们用于线程间的协作和通信。这两个方法是Java语言中的Object类提供的,因此所有的对象都可以使用。在本文中,我们将深入探讨如何使用主线程来控制...

Global site tag (gtag.js) - Google Analytics