sleep() 、wait() 、yield() 区别和共同点? notify 方法 、 join 方法

本文深入探讨Java中线程控制的关键方法,包括Thread类的sleep()方法、Object类的wait()和notify()方法,以及Thread类的yield()和join()方法。详细解析这些方法在多线程环境中的作用与应用,帮助读者理解线程间通信和同步机制。

sleep() 方法

  • sleep 是 Thread 类的静态方法
  • sleep 方法不会释放锁,它只是让线程阻塞一段时间。由于不会释放锁,所以容易造成死锁。
  • sleep 方法可以在任何地方使用,但必须捕获异常

wait() 方法

  • wait 是 Object 类的方法,用于线程间的通信,调用 wait 方法可以阻塞当前线程,并释放锁,直到其他线程调用 notify 或 notifyAll 方法才会苏醒。
  • wait 和 notify 方法必须放在同步代码块中使用,不需要捕获异常。

notify() 方法

  • 调用 notify 方法后,会唤醒该共享变量上由于调用 wait 方法而被挂起的一个线程。notifyAll 则会唤醒所有因 wait 方法被挂起的线程。
  • 被唤醒的线程必须等待调用 notify 的线程释放锁后,才能和其他线程一起竞争该锁,只有竞争成功了,被唤醒的线程才能继续执行。
wait - notify 的详细流程:

  A线程获取对象的锁 → 调用对象的wait方法 → A线程放弃锁并进入阻塞状态 → 随后B线程获取到了这个锁,并调用对象的notify方法 → A线程从阻塞状态变为就绪状态 → B线程释放锁后,A线程竞争获取到锁,并从wait方法返回,继续执行。

yield() 方法

  • yield 方法只会给优先级相同或更高的线程执行机会。
  • 调用 yield 方法只会使线程让出自己的时间片,并没有被阻塞,线程会重新回到就绪状态,下一次线程调度依然有机会再次执行。
  • 调用 yield 方法不需要捕获异常。

join() 方法

  • 在A线程中调用B线程的join()方法,表示只有当B线程执行完毕时,A线程才能继续执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值