线程间的通信:
比如在前几篇文章里有 一个卖票的例子,那么卖的票 也就是tickets=100 这就是资源。
多个线程在操作同一个对象的时候。那么就可以把cpu看做资源,因为只有抢到cup的线程才能继续执行并且去处理 这100张票的分配。(要知道我们所谓的同步执行,并不是多个线程在同时执行 而是cpu在以特别快的速度随机分配个任意一个线程时间片,只是这种速度特别快,使我们感觉好像在同意时间执行似的)。
所谓的释放资源 其实就是把cpu让出来,让其他的线程先执行。
wait()和sleep()的区别
wait() 是释放资源并且释放锁。
sleep() 释放资源但不释放锁。
举一个 日常生活的例子:
我们去厕所的时候,在厕所里面的哥们如果处于wait()状态 如果他不释放锁,也就是一直在厕所里呆着没有人交他,那么在厕所外面的哥们就得一直等着……但如果是处于sleep()状态就算没人叫他,一会儿就会醒,后面的哥们还是可以进去,所以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()不需要释放锁