`

Java多线程wait,notify实例

阅读更多
package com.lj.thread2;

public class Sample  
{
	private int number;

	// 实现number加1
	public synchronized void increase()
	{
		while (0 != number)
		{
			try
			{
				wait();
			}
			catch (InterruptedException e)
			{
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
		number++;
		
		System.out.println("number increased by "+Thread.currentThread().getName()+", number= "+ number);;
		notify();

	}
	
	
	public synchronized void decrease(){
		while(0==number){
			try
			{
				wait();
			}
			catch (InterruptedException e)
			{
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
		number--;
		System.out.println("number decreased by "+Thread.currentThread().getName()+", number= "+ number);;
		
		notify();
	}
	
	
	
}



这里定义了对象类, 实现数字在1和0之间进行不停的转换。


package com.lj.thread2;

public class IncreaseThread extends Thread
{
	private Sample sample;
	
	public IncreaseThread(Sample sample){
		this.sample=sample;
	}
	
	
	
	@Override
	public void run()
	{
		for(int i=0;i<20;i++){
			try
			{
				Thread.sleep(1000);
			}
			catch (InterruptedException e)
			{
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			sample.increase();
		}
		
	}
}

对数字加1的线程.

package com.lj.thread2;

public class DecreaseThread extends Thread
{
private Sample sample;
	
	public DecreaseThread(Sample sample){
		this.sample=sample;
	}
	
	
	
	@Override
	public void run()
	{
		for(int i=0;i<20;i++){
			try
			{
				Thread.sleep(1000);
			}
			catch (InterruptedException e)
			{
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			sample.decrease();
		}
		
	}
}





减1的线程


package com.lj.thread2;

public class Test
{
	public static void main(String[] args)
	{	
		Sample s=new Sample();
		Thread increase=new IncreaseThread(s);
		Thread decrease=new DecreaseThread(s);
		
		Thread i2=new IncreaseThread(s);
		Thread d2=new DecreaseThread(s);
		increase.start();
		i2.start();
		decrease.start();
		
		
		d2.start();
	}
}




这里的重点就是while循环那里不能写if。因为一个线程如果处于wait阶段,当它wait结束的时候, 要运行的时候必须再验证一下condition是否符合。
使用if的话不会去进行验证, 会直接执行number++或者number--, 导致错误。
分享到:
评论

相关推荐

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

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

    java中几个notify、wait使用实例

    java中多线程编程notify、wait的使用

    java 多线程实例

    java多线程应用实例,包括wait、notify、notifyAll等的应用方法,经过调试,可以直接运行。

    java多线程设计模式详解(PDF及源码)

    (注意,本资源附带书中源代码可供参考) 多线程与并发处理是程序设计好坏优劣的重要课题,本书通过浅显易懂的文字与实例来介绍Java线程相关的设计模式概念,并且通过实际的Java程序范例和 UML图示来一一解说,书中...

    Java多线程通信wait()和notify()代码实例

    主要介绍了Java多线程通信wait()和notify()代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    多线程实例 有讲解

    多线程实例 生产者、消费者有讲解 下面是其中一小部分代码 public synchronized void putShareChar(char c) { // 通知消费者已经生产,可以消费 if (isProduced) { // 如果产品还未消费,则生产者等待 try { ...

    java多线程通信之等待唤醒机制

     多线程间通信,其实是多个线程操操作同一个资源,但是操作方式不同。典型实例有生产者和消费者,本文也通过实例来分析线程等待唤醒机制。  1、相关API介绍  public final void notify()  唤醒在此对象监视...

    java笔试题大汇总

    同步的实现方面有两种,分别是synchronized,wait与notify 4、String 和StringBuffer的区别 JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供...

    java 面试题 总结

    与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。...

    python多线程高级锁condition简单用法示例

    本文实例讲述了python多线程高级锁condition简单用法。分享给大家供大家参考,具体如下: 多线程编程中如果使用Condition对象代替lock, 能够实现在某个事件触发后才处理数据, condition中含有的方法: – wait:线程...

    java程序设计实验指导代码

    第13章 多线程编程 13.1 预备知识 13.2 实验1 使用Thread类创建4线程程序 13.3 实验2 一个实现Runnable接口的小应用程序 13.4 实验3 线程同步与资源共享 13.5 实验4 wait( )和notify( )挂起与恢复线程 第14章 ...

    java基础案例与开发详解案例源码全

    12.4.3 wait和notify方法320 12.4.4 死锁322 12.5 集合类的同步问题323 12.5.1 使用synchronized同步块324 12.5.2 使用集合工具类同步化集合类对象324 12.5.3 使用JDK5.0后提供的并发集合类324 12.6 用Timer类调度...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    对Java语言的每个语法都提供了一个或多个例程讲解 大量使用流程图表示程序的执行过程,使用结构图表示程序的内部状态 每章最后都给出了典型的练习题,让读者及时练习,巩固提高,并提供了参考答案 目录 第1篇 ...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    对Java语言的每个语法都提供了一个或多个例程讲解 大量使用流程图表示程序的执行过程,使用结构图表示程序的内部状态 每章最后都给出了典型的练习题,让读者及时练习,巩固提高,并提供了参考答案 目录 第1篇 ...

    超级有影响力霸气的Java面试题大全文档

    与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。...

    Java测试题2答案

    DEF A notify() B wait() C notifyAll() D sleep() E.yield() F.synchronized(this) 7.构造BufferedInputStream的合适参数是哪个? AC A BufferedInputStream B BufferedOutputStream ...

    mylty_thread_review

    多线程复习,欢迎大家Star 包名和内容对应如下: no1_thread_imply 线程的几种实现方式 no2_wait_notify wait-notify-notifyAll的实例 no3_thread_hangup 线程挂起的几种实现方式 no4_join join的实例 no5_...

    java面试题

    答:Servlet与CGI的区别在于Servlet处于服务器进程中,它通过多线程方式允许其service方法,一个实例可以服务于多个请求,并且其实例一般不会被销毁,而CGI对每个请求都产生新的进程,服务完后就销毁,所以效率上...

    关于JAVA面试的100题及其答案

    与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。...

    python条件变量之生产者与消费者操作实例分析

    如果条件满足,进行一些处理改变条件后,通过notify方法通知其他线程,其他处于wait状态的线程接到通知后会重新判断条件。不断的重复这一过程,从而解决复杂的同步问题。 可以认为Condition对象维

Global site tag (gtag.js) - Google Analytics