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

来源:互联网 发布:问答系统cms 编辑:程序博客网 时间:2024/05/22 03:18
线程间的通信:


在多个线程操作同一个对象的时候,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 blocke.printStackTrace();}}this.name=name;this.money=money;this.qumoney=qumoney;try {Thread.sleep(500);//让当前线程短暂休眠,为了更清楚的看到运行结果} catch (InterruptedException e) {// TODO Auto-generated catch blocke.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 blocke.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 blocke.printStackTrace();}flg=false;notify();//这里notify()也是 如果此时quqian(……)这个线程处于执行阶段,那么在次之前一定要唤醒cunqian(……)这个线程}}class saving implements Runnable{Blank b=null;//设置被操作类的对象为nullpublic saving(Blank b){this.b=b;}@Overridepublic void run() {// TODO Auto-generated method stubwhile(true){b.cunqian("张三",100,20);}}}class takemoney implements Runnable{Blank b=null;public takemoney(Blank b){this.b=b;}@Overridepublic void run() {// TODO Auto-generated method stubwhile(true){b.quqian();}}}
新手在学习JAVA的时候一定要明白什么是资源:
比如在前几篇文章里有 一个卖票的例子,那么卖的票 也就是tickets=100 这就是资源。
多个线程在操作同一个对象的时候。那么就可以把cpu看做资源,因为只有抢到cup的线程才能继续执行并且去处理 这100张票的分配。(要知道我们所谓的同步执行,并不是多个线程在同时执行 而是cpu在以特别快的速度随机分配个任意一个线程时间片,只是这种速度特别快,使我们感觉好像在同意时间执行似的)。
所谓的释放资源 其实就是把cpu让出来,让其他的线程先执行。
wait()和sleep()的区别
wait() 是释放资源并且释放锁。
sleep() 释放资源但不释放锁。
举一个 日常生活的例子:
我们去厕所的时候,在厕所里面的哥们如果处于wait()状态 如果他不释放锁,也就是一直在厕所里呆着没有人交他,那么在厕所外面的哥们就得一直等着……但如果是处于sleep()状态就算没人叫他,一会儿就会醒,后面的哥们还是可以进去,所以sleep()不需要释放锁