线程——线程间的通信——wait()的区别 和sleep()

线程间的通信:


在多个线程操作同一个对象的时候,cup在处理多个线程的时候会出现一个线程还没有完全处理完 另一个线程抢夺资源,导致意想不到的结果发生所以此时用synchronized锁 会防止不安全因素的发生。

package hr.csdn.com;

public class BlankTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub\
		 Blank m=new Blank();
		 new Thread(new saving(m)).start();
		 new Thread(new takemoney(m)).start();
	}
}
class Blank{
	String name="张三";//定义成员变量
	int money=100;//存入的金额
	int qumoney=0;//取出的金额
	
	boolean flg=false;//作为调用wait()方法的一个标志
	public synchronized void cunqian(String name,int money,int qumoney){//同步函数,可以有效的防止因为资源释放而导致我们不想得到的结果
		if(flg){
			try {
				wait();//此方法可以另当前线程处于睡眠状态,让另一个线程继续按照我们的意向进行
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		this.name=name;
		this.money=money;
		this.qumoney=qumoney;
		try {
			Thread.sleep(500);//让当前线程短暂休眠,为了更清楚的看到运行结果
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println(name+" "+"存入"+" "+money);
		flg=true;//将标记设为true 使线程执行wait()方法
		notify();//唤醒刚刚处于wait()状态的线程,使其继续执行。在这里,如果cunqian(……)这个线程处于处于执行阶段,在它要到wait()这个
		//阶段之前,一定要唤醒 quqian()这个线程。切记 这里的notify()不是唤醒的cunqian(……)这个线程
	}
	public synchronized void quqian(){
		int morethan=money-qumoney;//余额设置变量
		if(!flg){
			try {
				wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		if(qumoney<=money){
			System.out.println(name+" "+"取出"+" "+qumoney+"余额"+morethan);
		}else{
			System.out.print("您已透支");
		}
		try {
			Thread.sleep(500);//同上
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		flg=false;
		notify();//这里notify()也是 如果此时quqian(……)这个线程处于执行阶段,那么在次之前一定要唤醒cunqian(……)这个线程
	}
	
	
}
class saving implements Runnable{
	Blank b=null;//设置被操作类的对象为null
	public saving(Blank b){
		this.b=b;
	}
	@Override
	public void run() {
		// TODO Auto-generated method stub
		
			while(true){
				b.cunqian("张三",100,20);
			}
		
	}
		
}
class takemoney implements Runnable{
	Blank b=null;
	public takemoney(Blank b){
		this.b=b;
	}
	@Override
	public void run() {
		// TODO Auto-generated method stub
		while(true){
			b.quqian();
		}
		
	}
	
}
新手在学习JAVA的时候一定要明白什么是资源:
比如在前几篇文章里有 一个卖票的例子,那么卖的票 也就是tickets=100 这就是资源。
多个线程在操作同一个对象的时候。那么就可以把cpu看做资源,因为只有抢到cup的线程才能继续执行并且去处理 这100张票的分配。(要知道我们所谓的同步执行,并不是多个线程在同时执行 而是cpu在以特别快的速度随机分配个任意一个线程时间片,只是这种速度特别快,使我们感觉好像在同意时间执行似的)。
所谓的释放资源 其实就是把cpu让出来,让其他的线程先执行。
wait()和sleep()的区别
wait() 是释放资源并且释放锁。
sleep() 释放资源但不释放锁。
举一个 日常生活的例子:
我们去厕所的时候,在厕所里面的哥们如果处于wait()状态 如果他不释放锁,也就是一直在厕所里呆着没有人交他,那么在厕所外面的哥们就得一直等着……但如果是处于sleep()状态就算没人叫他,一会儿就会醒,后面的哥们还是可以进去,所以sleep()不需要释放锁

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值