`
endual
  • 浏览: 3567296 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

java wait() notyfy()的使用

    博客分类:
  • java
 
阅读更多

我们知道,并发的编程在企业中用的很多,对于并发的学习是很重要的。

现在我们想从程序上给大家一个分析,在我写这个程序的时候,只知道wait()是线程等待,

notify是唤醒线程,还有一个notifyAll是唤醒所有线程,一般情况下 我们为了保险起见,会用notifyAll来唤醒我们的线程的。

 

 

但是,你是真的理解这个意思么,下面我们来看一个程序吧。

 

 

main类

package endual;

public class MainApp {

	public static void main(String[] args) {
		Query q = new Query(0) ;
		Query1 q1 = new Query1(0) ;
		Thread thread = new Thread(new Thread1(q)) ;
		Thread thread2 = new Thread(new Thread2(q)) ;
		Thread thread3 = new Thread(new Thread3(q1)) ;
		thread.start() ;
		thread2.start() ;
		
		thread3.start() ;
	}
	
}

 

 

Query1类

package endual;

public class Query1 {

	private int value = 7;
	private boolean isFlag = false ;
	public Query1(int value) {
		
		//this.value = value ;
	}
	
	public synchronized  void getValue() {
		
		try {
			wait() ; //如果有人叫他,那么他会唤醒,然就执行下面的程序了
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("-------------------------------------------") ;
		
	}
	
	
	

}

 

query类

 

package endual;

public class Query {

	private int value = 7;
	private boolean isFlag = false ;
	public Query(int value) {
		
		//this.value = value ;
	}
	
	public synchronized  void getValue() {
		
		if (!isFlag) { //如果是正确的
			
			isFlag = true ;
			notifyAll() ;
		}
		
		try {
			wait() ;
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		System.out.println("我是线程1" + (value++)) ;
		
		
	}
	
	public synchronized void setValue() {
		
		if (!isFlag) { //如果是正确的
			
			try {
				wait() ;
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			
		}
		
		isFlag = false ;
		value-- ;
		System.out.println("我是线程2" + value) ;
		notifyAll() ;
	}
	

}

 

很显然,上面有的方法是notifyAll这个意思就是说唤醒所有等待的线程了。

 

 

三个线程:

package endual;

public class Thread1 implements Runnable{

 private Query q = null ;
 
 public Thread1(Query q) {
  this.q = q ;
 }
 
 public void run() {

  while (true) {
   
   q.getValue() ;
   
  }
  
 }

}










--------------------------------------------



package endual;

public class Thread2 implements Runnable{

 private Query q = null ;
 
 public Thread2(Query q) {
  this.q = q ;
 }
 
 public void run() {

  while (true) {
   
  q.setValue() ;
   
  }
  
 }
}




-------------------------------------



package endual;

public class Thread3 implements Runnable{

 private Query1 q1 = null ;
 
 public Thread3(Query1 q1) {
  this.q1 = q1 ;
 }
 
 public void run() {

  while (true) {
   
   q1.getValue() ;
   
  }
  
 }

}


















 

 

 

请问,打印的结果中会出现------------------------------------------------------------------

这个么?

 

分享到:
评论
1 楼 zhl549342097 2012-04-20  
还行吧

相关推荐

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

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

    Java的sychronized、wait和notify范例

    在提供的压缩包文件`java_sychronization`中,可能包含了一些示例代码,用于演示如何在Java中使用`synchronized`关键字以及`wait()`和`notify()`方法。通过研究这些样例,你可以更深入地了解这些工具的用法和效果。...

    Java 同步锁 wait notify 学习心得

    标题和描述概述的知识点主要集中在Java的多线程机制中,特别是`wait`和`notify`方法在同步锁中的应用。这些方法对于控制线程之间的交互至关重要,尤其是在资源有限或需要确保数据一致性的情况下。 ### Java同步锁...

    JAVAWAIT和NOTIFY的用法.pdf

    JAVAWAIT和NOTIFY的用法.pdf

    wait_notify_demo

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

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

     在 Java 中可以用 wait、notify 和 notifyAll 来实现线程间的通信。。举个例子,如果你的Java程序中有两个线程——即生产者和消费者,那么生产者可以通知消费者,让消费者开始消耗数据,因为队列缓冲区中有内容待...

    java中几个notify、wait使用实例

    在Java的多线程编程中,`notify()`与`wait()`是实现线程间通信的重要方法,它们主要用于解决生产者消费者问题、读者写者问题等典型同步问题。这两个方法定义在`Object`类中,因此所有Java对象都可以作为锁来使用。在...

    Java多线程中wait、notify、notifyAll使用详解

    Java多线程中wait、notify、notifyAll使用详解 Java中多线程编程中,wait、notify、notifyAll三个方法是非常重要的,它们都是Object对象的方法,用于线程之间的通信。下面我们将详细介绍这三个方法的使用和作用。 ...

    Java wait和notifyAll实现简单的阻塞队列

    Java wait和notifyAll实现简单的阻塞队列 在 Java 中,wait 和 notifyAll 是两个非常重要的方法,它们都是在 Object 类中声明的,用于实现线程之间的通信和同步。wait 方法会使调用线程进入等待状态,并释放所持有...

    Java 同步方式 wait和notify/notifyall

    下面是一个简单的生产者消费者模型示例,演示了`wait()`, `notify()` 的使用: ```java public class Buffer { private int data; private boolean available = false; public synchronized void put(int item)...

    Java多线程wait和notify

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

    解决TIME_WAIT过多造成的问题1

    例如,在Java中,可以通过设置SOCKET选项来调整TIME_WAIT状态的处理方式,比如使用SO_LINGER选项来改变TCP关闭连接的行为,或者使用SO_REUSEADDR选项来允许端口重用,尽管这样做可能会增加因为重复分组造成的风险。...

    java sleep()和wait()

    ### Java中的sleep()与wait()方法详解 #### 一、Java sleep()方法解析 ##### 1.1 方法定义与用途 `sleep()`方法是Thread类中的一个静态方法,用于让当前正在执行的线程暂停执行指定的时间(毫秒),之后线程将重新...

    Java线程中wait,await,sleep,yield,join用法总结.pdf

    在Java编程中,多线程的使用是实现程序并发运行的重要手段。本文将总结五个关键的线程控制方法:wait()、await()、sleep()、yield()和join()。这些方法各自有独特的用途和不同的工作机制。 一、wait()、notify()、...

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

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

    CentOS解决服务器存在大量time_wait的问题

    当服务器之间的通信过于频繁,如通过REST请求互相调用时,Java服务器可能无法及时回收TCP连接,导致TIME_WAIT状态的连接积累。 TIME_WAIT状态是TCP连接生命周期的一部分,它确保数据完全传输并且防止旧的数据包被误...

    浅谈java多线程wait,notify

    在本文中,我们将通过示例代码详细介绍Java多线程wait和notify的使用,帮助读者更好地理解和掌握这两个机制。 wait机制 在Java中,wait机制用于暂停当前线程的执行,并释放当前对象的锁,以便让其他线程获得锁并...

    浅谈Java线程间通信之wait/notify

    Java线程间通信之wait/notify Java中的wait/notify/notifyAll可用来实现线程间通信,是Object类的方法,这三个方法都是native方法,是平台相关的,常用来实现生产者/消费者模式。 wait()方法将当前线程置于等待...

    java Object wait方法详细介绍

    尽管Java规范保证了`wait()`会被正确唤醒,但使用`while`循环可以增加代码的健壮性。 7. 调用`wait()`后,线程不会立即释放锁,而是在`wait()`方法返回前释放。因此,线程在等待期间不会占用锁资源。 通过深入理解...

    Java的wait(), notify()和notifyAll()使用心得

    Java中的`wait()`, `notify()`, 和 `notifyAll()` 是多线程编程中的关键工具,它们用于在并发环境中协调线程间的交互。这些方法都定义在`java.lang.Object`类中,因为它们与对象的监视器(monitor)概念密切相关。...

Global site tag (gtag.js) - Google Analytics