Java中notify与wait

Java中api对noyify以及wait的解释如下。
public final void notify()唤醒正在等待对象监视器的单个线程。 如果任何线程正在等待这个对象,其中一个被选择被唤醒。 选择是任意的,并且由实施的判断发生。 线程通过调用wait方法之一等待对象的监视器。
唤醒的线程将无法继续,直到当前线程放弃此对象上的锁定为止。 唤醒的线程将以通常的方式与任何其他线程竞争,这些线程可能正在积极地竞争在该对象上进行同步; 例如,唤醒的线程在下一个锁定该对象的线程中没有可靠的权限或缺点。
public final void wait()
throws InterruptedException导致当前线程等待,直到另一个线程调用该对象的notify()方法或notifyAll()方法。 换句话说,这个方法的行为就好像简单地执行呼叫wait(0) 。
当前的线程必须拥有该对象的显示器。 该线程释放此监视器的所有权,并等待另一个线程通知等待该对象监视器的线程通过调用notify方法或notifyAll方法notifyAll 。 然后线程等待,直到它可以重新获得监视器的所有权并恢复执行。
简而言之,Java的多线程有四种状态,就绪,运行,阻塞,死亡。就绪与阻塞的区别是就绪转为运行状态只需要等待cpu的调用,而阻塞还需要获取除cpu以外的资源,当多线程执行到wait方法时,会进入阻塞状态,Java会把其放在等待池中,他必须获取锁对象才能进入就绪状态,如何获取锁对象,那就是执行notify方法,该方法会把一个处在等待池中的线程唤醒,也就是把锁对象赋予该线程。该对象就会进入到锁池,与锁池其他线程争抢cpu。而notify方法时随机唤醒一个线程。
但经过查阅和了解其他人的实验,发现notify方法是按照队列的先进后出唤醒的。
新建一个MyThread 类
public class MyThread extends Thread{
public int num;
//创建锁对象
public static Object object=new Object();
public Mytread(int num){
this.num=num;
}
//线程体
public void run(){
synchronized (object){
System.out.print(num+"\t");
try {
//将线程放在等待池
object.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.print(num+"\t");
}

}

}
新建一个Test 类

public class Test {
public static void main(String[] args) {
MyThread mytread;
//创建100个线程
for (int i=0;i<100;i++){
mytread=new MyThread (i);
mytread.start();
if(i10){
System.out.println();
}
}
try {
//主线程沉睡2秒
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//此时100个线程全部处在等待池
System.out.println();
System.out.println("
=========================================");

        for (int i=0;i<100;i++){
            synchronized (Mytread.object){
                //将所有线程唤醒
                Mytread.object.notify();
            }
            try {
                //主线程沉睡,保证每个线程被唤醒后立即执行
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if(i==10){
                System.out.println();
            }
        }




}

}
发现输出结果是按照队列的先进后出方式进行输出的,而不是随意唤醒一个。经过查阅资料后,发现虚拟机的底层实现方式不同,notify在HotSpot虚拟机中是按照队列唤醒的,而在其他虚拟机中不一定是按照顺序唤醒。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值