sleep()和wait()有什么区别?

  • sleep() 是 Thread 类的静态本地方法;wait() 是Object类的成员本地方法
  • sleep() 方法可以在任何地方使用;wait() 方法则只能在同步方法或同步代码块中使用,否则抛出异常Exception in thread "Thread-0" java.lang.IllegalMonitorStateException
  • sleep() 会休眠当前线程指定时间,释放 CPU 资源,不释放对象锁,休眠时间到自动苏醒继续执行;wait() 方法放弃持有的对象锁,进入等待队列,当该对象被调用 notify() / notifyAll() 方法后才有机会竞争获取对象锁,进入运行状态
  • JDK1.8 sleep() wait() 均需要捕获 InterruptedException 异常

测试代码

public class TestWaitSleep { private static Object obj = new Object();public static void main(String[] args) {//测试sleep()//测试 RunnableImpl1 wait(); RunnableImpl2 notify()Thread t1 = new Thread(new RunnableImpl1(obj));Thread t2 = new Thread(new RunnableImpl2(obj));t1.start();t2.start();//测试RunnableImpl3 wait(long timeout)方法Thread t3 = new Thread(new RunnableImpl3(obj));t3.start();} } class RunnableImpl1 implements Runnable { private Object obj;public RunnableImpl1(Object obj) {this.obj = obj;}public void run() {System.out.println("run on RunnableImpl1");synchronized (obj) {System.out.println("obj to wait on RunnableImpl1");try {obj.wait();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("obj continue to run on RunnableImpl1");}}} class RunnableImpl2 implements Runnable { private Object obj;public RunnableImpl2(Object obj) {this.obj = obj;}public void run() {System.out.println("run on RunnableImpl2");System.out.println("睡眠3秒...");try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}synchronized (obj) {System.out.println("notify obj on RunnableImpl2");obj.notify();}}} class RunnableImpl3 implements Runnable { private Object obj;public RunnableImpl3(Object obj) {this.obj = obj;}public void run() {System.out.println("run on RunnableImpl3");synchronized (obj) {System.out.println("obj to wait on RunnableImpl3");try {obj.wait(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("obj continue to run on RunnableImpl3");}}}

打印结果

run on RunnableImpl2睡眠3秒...run on RunnableImpl1obj to wait on RunnableImpl1run on RunnableImpl3obj to wait on RunnableImpl3obj continue to run on RunnableImpl3notify obj on RunnableImpl2obj continue to run on RunnableImpl1

给TA打赏
共{{data.count}}人
人已打赏
Java

如何优雅地停止一个线程?

2020-7-31 0:43:20

Java

2020-7-31 0:46:40

本站所发布的一切源码、模板、应用等文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权。本站内容适用于DMCA政策。若您的权利被侵害,请与我们联系处理,站长 QQ: 84087680 或 点击右侧 私信:盾给网 反馈,我们将尽快处理。
⚠️
本站所发布的一切源码、模板、应用等文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权。本站内容适用于DMCA政策
若您的权利被侵害,请与我们联系处理,站长 QQ: 84087680 或 点击右侧 私信:盾给网 反馈,我们将尽快处理。
0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索