多线程 wait() notify的用法

main 类

 

package endual;

public class MainApp {

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

 

 

 

 集中调用我们做一个类

 

 

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 ;
			notify() ;
		}
		
		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) ;
		notify() ;
	}
	

}

 

 

我们写两个线程 分别要调用query的get 和set 的方法

 

thread1

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() ;
			
		}
		
	}

}

 

 

 

thread2

 

 

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() ;
			
		}
		
	}
}

 

====================================================

 

我们来分析程序:

这个是两个线程之间等待以及唤醒对方,对待对方。

但是有一个重要的一点就是要添加一个关键词就是 synchronized 添加到方法的前面,如果不添加的话

会出现一个exception。其实我还不明白这是什么意思也不知道。要查下,平时我们学习的时候没有用到线程,特别是java web方面的学习,底层的框架已经给你写好这些了,我们只需要用的是写一下业务逻辑就可以了

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值