Java中怎么实现线程的等待与唤醒

这篇文章给大家介绍Java中怎么实现线程的等待与唤醒,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

实例代码:

Java中怎么实现线程的等待与唤醒

classThreadAextendsThread{

publicThreadA(Stringname){
super(name);
}

publicvoidrun(){
synchronized(this){
System.out.println(Thread.currentThread().getName()+"callnotify()");
notify();
}
}
}
publicclassWaitTest{
publicstaticvoidmain(String[]args){
ThreadAt1=newThreadA("t1");
synchronized(t1){
try{
//启动“线程t1”
System.out.println(Thread.currentThread().getName()+"startt1");
t1.start();

//主线程等待t1通过notify()唤醒。
System.out.println(Thread.currentThread().getName()+"wait()");
t1.wait();

System.out.println(Thread.currentThread().getName()+"continue");
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
}
}

输出结果:main start t1 -> main wait() -> t1 call notify() -> main continue

其实调用t1.start(),t1为就绪状态,只是main方法中,t1被main线程锁住了,t1.wait()的时候,让当前线程等待,其实是让main线程等待了,然后释放了t1锁,t1线程执行,打印t1 call notify(),然后唤醒main线程,最后结束;

这里说一下wait()与sleep()的区别,他们的共同点都是让线程休眠,但是wait()会释放对象同步锁,而sleep()不会;下面的代码t1结束之后才会运行t2;能够证实这一点;

publicclassSleepLockTest{
privatestaticObjectobj=newObject();
publicstaticvoidmain(String[]args){
ThreadAt1=newThreadA("t1");
ThreadAt2=newThreadA("t2");
t1.start();
t2.start();
}
staticclassThreadAextendsThread{
publicThreadA(Stringname){
super(name);
}
publicvoidrun(){
synchronized(obj){
try{
for(inti=0;i<10;i++){
System.out.printf("%s:%d\n",this.getName(),i);
//i能被4整除时,休眠100毫秒
if(i%4==0)
Thread.sleep(100);
}
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
}
}
}

关于Java中怎么实现线程的等待与唤醒就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

发布于 2021-06-13 23:19:07
收藏
分享
海报
0 条评论
158
上一篇:java中如何实现对象的序列化和反序列化 下一篇:微信小程序中基础入门的示例分析
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码