首页 > 编程知识 正文

wait为什么在object(线程wait和notify使用)

时间:2023-05-03 16:24:51 阅读:76436 作者:363

wait、notify和notifyAll是为Object类定义的实例方法,用于控制线程的状态。 线程协作使用notify (或notifyAll ) )方法。 其中wait和notify是java同步机制的重要组成部分,必须与Synchronnnon ) )结合使用。调用Object的wait和notify/notifyAll时,调用代码就是其对象代码必须确保只能在与同步(对象)……}等效的内部调用obj的wait和notify/notify,否则将报告错误。 Java.lang.illegalmonitorstateexception : currentthreadnotowner (由于不同步,线程锁定到对象的状态不确定,因此调用这些方法

因为wait的目的是暴露对象锁,所以必须在lock的同步代码中调用lock.wait ()方法,以便其他线程能够在对象的notify中引发位于该对象队列中的线程同样,notify也必须解除对象锁定,并在调用之前获取对象的锁定。 否则,报告例外。 因此,在自动释放线程占用的对象锁定之后,不再申请对象锁定,而是仅当线程被调用或达到最大睡眠时间时才再次获得对象锁定的权利

主要方法:

(1).wait ) )。

要调用此方法,必须等待对象的同步锁定。 否则,编译将通过,但在运行时会出现名为IllegalMonitorStateException的异常。 调用任何对象的wait ()方法将阻止线程,使线程无法执行,并解除对象的锁定。

(2).notify ) )。

唤醒正在等待该对象同步锁定的线程(如果只唤醒一个线程,并且有多个线程在等待)。 请注意。 调用此方法时,无法准确唤醒某个等待状态的线程。 决定JVM唤醒哪个线程,而不是优先级。 调用任何对象的notify ) )方法时,将通过调用该对象的wait ) )方法从阻止的线程中取消随机选择的块。 但是,实际上可以在获取锁定之后执行。

(3).notifyAll ) )。

唤醒所有等待的线程。 注意,唤醒的是通告之前的等待线程,而通告之后的等待线程没有效果。

用一个例子来看看实际的效果吧。 两条线和一个线程打印1到52之间的数字,一个打印a到z之间的字符。 请求,打印两个数,打印一个字符。 这样交替顺序打印,代码如下。

/* * *创建按spy on 2018/6/4 * /

publicclasshuzizimuthread { publicstaticvoidmain { string [ ] args }

对象对象=new对象(;

shuzi shuzi=new shuzi (对象);

zimu zimu=new zimu (对象;

threadt=newthread(Shuzi );

t.setname(Shuzi );

threadT1=newthread(zimu;

t1 .设置名称(zimu );

t.start (; //数字线程先工作

t1 .开始(;

}

} classshuziimplementsrunnable { privateobjectobject; //声明类引用

公共shuzi (对象对象) {this.object=object;

}公共void run (()同步) ) object )//锁定

for(intI=1; i53; I ) {

system.out.print(I ','; if(I%2==0) {

object.notifyAll (; //唤醒其他权限争用线程

try{

object.wait (; //解锁,进入等待

System.out.println (数字打印类完全打印当前对象具有对象锁定的线程(Thread.currentThread ) ).getName )。 //输出当前具有锁定的线程名称

} catch (互联互通) )

e .打印堆栈跟踪(;

}

}

}

}

}

} classzimuimplementsrunnable {私有对象对象对象; 公共zimu (objectobject ) {this.object=object;

}公共void run ()同步(对象) ) for(intj=65; j91; j ) (charc=) char ) j;

系统. out.print (c;

object.notifyAll();//唤醒其它争夺权限的线程

try{

object.wait();//释放锁,进入等待

System.out.println("字母打印类打全打印当前对象拥有对象锁的线程"+Thread.currentThread().getName());//输出当前拥有锁的线程名称

} catch(InterruptedException e) {

e.printStackTrace();

}

}

}

}

}

实际运行的结果 :

1,2,A数字打印类打印当前对象拥有对象锁的线程shuzi

3,4,字母打印类打印当前对象拥有对象锁的线程zimu

B数字打印类打印当前对象拥有对象锁的线程shuzi

5,6,字母打印类打印当前对象拥有对象锁的线程zimu

C数字打印类打印当前对象拥有对象锁的线程shuzi

7,8,字母打印类打印当前对象拥有对象锁的线程zimu

D数字打印类打印当前对象拥有对象锁的线程shuzi

9,10,字母打印类打印当前对象拥有对象锁的线程zimu

E数字打印类打印当前对象拥有对象锁的线程shuzi

11,12,字母打印类打印当前对象拥有对象锁的线程zimu

F数字打印类打印当前对象拥有对象锁的线程shuzi

13,14,字母打印类打印当前对象拥有对象锁的线程zimu

G数字打印类打印当前对象拥有对象锁的线程shuzi

15,16,字母打印类打印当前对象拥有对象锁的线程zimu

H数字打印类打印当前对象拥有对象锁的线程shuzi

17,18,字母打印类打印当前对象拥有对象锁的线程zimu

I数字打印类打印当前对象拥有对象锁的线程shuzi

19,20,字母打印类打印当前对象拥有对象锁的线程zimu

J数字打印类打印当前对象拥有对象锁的线程shuzi

21,22,字母打印类打印当前对象拥有对象锁的线程zimu

K数字打印类打印当前对象拥有对象锁的线程shuzi

23,24,字母打印类打印当前对象拥有对象锁的线程zimu

L数字打印类打印当前对象拥有对象锁的线程shuzi

25,26,字母打印类打印当前对象拥有对象锁的线程zimu

M数字打印类打印当前对象拥有对象锁的线程shuzi

27,28,字母打印类打印当前对象拥有对象锁的线程zimu

N数字打印类打印当前对象拥有对象锁的线程shuzi

29,30,字母打印类打印当前对象拥有对象锁的线程zimu

O数字打印类打印当前对象拥有对象锁的线程shuzi

31,32,字母打印类打印当前对象拥有对象锁的线程zimu

P数字打印类打印当前对象拥有对象锁的线程shuzi

33,34,字母打印类打印当前对象拥有对象锁的线程zimu

Q数字打印类打印当前对象拥有对象锁的线程shuzi

35,36,字母打印类打印当前对象拥有对象锁的线程zimu

R数字打印类打印当前对象拥有对象锁的线程shuzi

37,38,字母打印类打印当前对象拥有对象锁的线程zimu

S数字打印类打印当前对象拥有对象锁的线程shuzi

39,40,字母打印类打印当前对象拥有对象锁的线程zimu

T数字打印类打印当前对象拥有对象锁的线程shuzi

41,42,字母打印类打印当前对象拥有对象锁的线程zimu

U数字打印类打印当前对象拥有对象锁的线程shuzi

43,44,字母打印类打印当前对象拥有对象锁的线程zimu

V数字打印类打印当前对象拥有对象锁的线程shuzi

45,46,字母打印类打印当前对象拥有对象锁的线程zimu

W数字打印类打印当前对象拥有对象锁的线程shuzi

47,48,字母打印类打印当前对象拥有对象锁的线程zimu

X数字打印类打印当前对象拥有对象锁的线程shuzi

49,50,字母打印类打印当前对象拥有对象锁的线程zimu

Y数字打印类打印当前对象拥有对象锁的线程shuzi

51,52,字母打印类打印当前对象拥有对象锁的线程zimu

Z数字打印类打印当前对象拥有对象锁的线程shuzi

结果分析:

通过结果可以看出:

在字母打一打印类里 调用完

object.notifyAll();//唤醒其它争夺权限的线程

object.wait();//释放锁,进入等待

后,拥有对象锁的线程是shuzi

在数字打印类里 调用完

object.notifyAll();//唤醒其它争夺权限的线程

object.wait();//释放锁,进入等待

后,拥有对象锁的线程是zimu

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。