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 异常

测试代码

  1. 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");}}}

打印结果

  1. 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

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管理员
欢迎您,新朋友,感谢参与互动!
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
私信列表
搜索