java 多线程中的 wait 和 notify

wait和notify是通过对对象进行锁,来实现同步和互斥。

wait和notify函数需要在一段的同步代码中,即在 synchronized的代码段中。

简单的示例代码。

static class TestThread {
		public Boolean locked = false;

		public void run() {
			long last = System.currentTimeMillis();
			synchronized (locked) {
				while (locked) {
					// 释放这个锁吗?
					try {
						System.out.println(Thread.currentThread().toString()
								+ " now is waiting");
						// 也就是最后测试的结果是,这个wait处如果没有写具体时间的话,其他的notify是不会叫醒这里的锁的。
						locked.wait(1000);
						System.out.println(Thread.currentThread().toString()
								+ " waiting is end");
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}

			}
			// System.out.println(Thread.currentThread().toString()
			// + " lock locked ");
			locked = true;
			// work。
			// System.out.println(Thread.currentThread().toString()
			// + " work start ");
			// System.out.println(Thread.currentThread().toString()
			// + " work start locked" + locked);
			long now = System.currentTimeMillis();
			while (now - last < 1000) {
				locked = true;
				now = System.currentTimeMillis();
			}
			locked = false;
			// System.out.println(Thread.currentThread().toString()
			// + " work end notify" );
			synchronized (locked) {
				locked.notifyAll();
				System.out.println(Thread.currentThread().toString()
						+ " work end notify");
			}
			// System.out.println(Thread.currentThread().toString()
			// + " work finished ");
		}

	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		final TestThread tt = new TestThread();
		for (int i = 0; i < 5; i++) {
			new Thread(new Runnable() {
				public void run() {
					tt.run();
				}
			}).start();
		}

输出结果为:

Thread[Thread-2,5,main] now is waiting

Thread[Thread-3,5,main] now is waiting

Thread[Thread-4,5,main] now is waiting

Thread[Thread-1,5,main] work end notify

Thread[Thread-0,5,main] work end notify

Thread[Thread-2,5,main] waiting is end

Thread[Thread-2,5,main] work end notify

Thread[Thread-3,5,main] waiting is end

Thread[Thread-3,5,main] work end notify

Thread[Thread-4,5,main] waiting is end

Thread[Thread-4,5,main] work end notify

这里我锁的是TestThread中的Boolean 对象 locked。通过synchronized (locked) 将locked对象锁住,但是  locked.wait(1000)又将这个locked对象锁给释放了,导致其他线程可以访问locked对象。然后被释放的对象被其他线程使用结束后,使用 locked.notifyAll(); 通知其他等待该对象的线程当前对象可以使用。这里需要注意的地方,一般说明的是wait()的线程都会被提醒并获得对象锁再继续运行,但实际上我测试的结果不是这样的,如果我这里没有设置时间如这里的1000ms,则当使用notify或notifyAll时,均无法重新启动线程,所以应该设置一定的时间让线程自行检测。

时间: 2024-10-11 21:03:16

java 多线程中的 wait 和 notify的相关文章

Java多线程中的wait与notify

(1)wait: 1. wait 是 object 类的方法, sleep 是 thread 类的方法. 2. 当前的正在我这个对象访问的线程 wait. 3. 当前的这个线程, 锁定在当前对象的这个线程停止住. 4. 只有锁定后, 才能有wait; 如果不是 synchronized, 直接调用 wait, 立马出错. (2)锁的问题: 1. 原来不是拥有这个对象的锁吗? 一旦 wait ,立马就死了, 这个对象的锁就不再归我所有, 只有醒过来的时候, 我才会再找这把锁, 把它找回来. (3)

java多线程15 :wait()和notify() 的生产者/消费者模式

什么是生产者/消费者模型 一种重要的模型,基于等待/通知机制.生产者/消费者模型描述的是有一块缓冲区作为仓库,生产者可将产品放入仓库,消费者可以从仓库中取出产品,生产者/消费者模型关注的是以下几个点: 1.生产者生产的时候消费者不能消费 2.消费者消费的时候生产者不能生产 3.缓冲区空时消费者不能消费 4.缓冲区满时生产者不能生产 生产者/模型作为一种重要的模型,它的优点在于: 1.解耦.因为多了一个缓冲区,所以生产者和消费者并不直接相互调用,这一点很容易想到,这样生产者和消费者的代码发生变化,

转 Java多线程中Sleep与Wait的区别

Java中的多线程是一种抢占式的机制,而不是分时机制.抢占式的机制是有多个线程处于可运行状态,但是只有一个线程在运行. 共同点: 1. 他们都是在多线程的环境下,都可以在程序的调用处阻塞指定的毫秒数,并返回. 2. wait()和sleep()都可以通过interrupt()方法 打断线程的暂停状态 ,从而使线程立刻抛出InterruptedException. 如果线程A希望立即结束线程B,则可以对线程B对应的Thread实例调用interrupt方法.如果此刻线程B正在wait/sleep/

thread.join函数,java多线程中的join函数解析

join函数的作用,是让当前线程等待,直到调用join()的 线程结束或者等到一段时间,我们来看以下代码 1 package mian; 2 3 4 public class simpleplela { 5 static void threadMessage(String message) { 6 String threadName = 7 Thread.currentThread().getName(); 8 9 System.out.println(threadName+" "+m

java多线程中join用法

thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程.比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B. package com.wzs; /** * Java多线程中join用法 * * @author Administrator * */ public class JoinTest { public static void main(String[] args) { BThread bThread = new B

Java多线程中的死锁问题[转]

//申明:本文转载自http://www.cnblogs.com/digdeep/p/4448148.html <Java多线程中的死锁问题> Java程序基本都要涉及到多线程,而在多线程环境中不可避免的要遇到线程死锁的问题.Java不像数据库那么能够检测到死锁,然后进行处理,Java中的死锁问题,只能通过程序员自己写代码时避免引入死锁的可能性来解决. 1. Java中导致死锁的原因 Java中死锁最简单的情况是,一个线程T1持有锁L1并且申请获得锁L2,而另一个线程T2持有锁L2并且申请获得

Java多线程中的竞争条件、锁以及同步的概念

竞争条件 1.竞争条件: 在java多线程中,当两个或以上的线程对同一个数据进行操作的时候,可能会产生"竞争条件"的现象.这种现象产生的根本原因是因为多个线程在对同一个数据进行操作,此时对该数据的操作是非"原子化"的,可能前一个线程对数据的操作还没有结束,后一个线程又开始对同样的数据开始进行操作,这就可能会造成数据结果的变化未知. package com.huojg.test; public class TestThread { public static void

Java多线程中的Runnable和Thread

摘要: 在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类是在java.lang包中定义的.一个类只要继承了Thread类同时覆写了本类中的run()方法就可以实现多线程操作了,但是一个类只能继承一个父类,这是此方法的局限. 用法: Thread: package org.thread.demo;class MyThread extends Thread{ private String name; public MyThread(Stri

Java多线程之~~~~使用wait和notify实现生产者消费者模型

在多线程开发中,最经典的一个模型就是生产者消费者模型,他们有一个缓冲区,缓冲区有最大限制,当缓冲区满 的时候,生产者是不能将产品放入到缓冲区里面的,当然,当缓冲区是空的时候,消费者也不能从中拿出来产品,这就 涉及到了在多线程中的条件判断,java为了实现这些功能,提供了wait和notify方法,他们可以在线程不满足要求的时候 让线程让出来资源等待,当有资源的时候再notify他们让他们继续工作,下面我们用实际的代码来展示如何使用wait和 notify来实现生产者消费者这个经典的模型. 首先是