javasleep和wait区别,wait()和sleep()的区别

  javasleep和wait区别,wait()和sleep()的区别

  

目录

1.等待()与等待(长时间超时)区别2.等待(0)与睡眠(0)区别3.等待和睡眠释放代码4.等待与睡眠区别相同点:不同点:

 

  

1. wait() 与wait(long timeout ) 区别

公共类等待演示4 { public static void main(String[]args){ Object lock=new Object();对象锁2=新对象();新线程(()- { System.out.println(线程1: 开始执行本地日期时间。now());synchronized(lock){ try { lock。wait();} catch(中断异常e){ e . printstacktrace();} System.out.println(线程1: 执行完成本地日期时间。now());} },无参等待线程).start();新线程(()- { System.out.println(线程2: 开始执行本地日期时间。now());同步(锁2){尝试{锁2。等待(1000);} catch(中断异常e){ e . printstacktrace();} System.out.println(线程2: 执行完成本地日期时间。now());} },有参等待线程).start();}} 输出:线程2: 开始执行12t 12:13:57.130线程1: 开始执行12t 12:13:57.130线程2: 执行完成12t 12:13:58.130不同点:

 

  1 .等待(长超时):当线程超过了设置时间之后,自动恢复执行;而等待()无线等待状态。

  2.使用无参的等待方法,线程会进入等待;使用有参的等待方法,线程会进入定时等待.

  public class wait demo 5 { public static void main(String[]args){ Object lock=new Object();对象锁2=新对象();新线程(()-{ synchronized(lock 2){ system。出去。println(线程2: 开始执行本地日期时间。now());试试{锁定2。等等(60 * 60 * 1000);} catch(中断异常e){ e . printstacktrace();} System.out.println(线程2: 执行完成本地日期时间。now());} },有参等待线程).start();新线程(()- {试试{ TimeUnit .秒。睡眠;} catch (InterruptedException e) {

   e.printStackTrace(); } synchronized (lock2) { System.out.println("唤醒线程2"); lock2.notify(); } }).start(); }}输出:线程2: 开始执行2022-04-12T12:28:23.200唤醒线程2线程2: 执行完成2022-04-12T12:28:24.169

public class WaitDemo6 { public static void main(String[] args) { Object lock = new Object(); new Thread(() -> { System.out.println("线程1: 开始执行" + LocalDateTime.now()); synchronized (lock) { try { lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("线程1: 执行完成" + LocalDateTime.now()); } },"无参wait线程").start(); new Thread(() -> { System.out.println("线程2: 开始执行" + LocalDateTime.now()); synchronized (lock) { try { lock.wait(60 * 60 * 1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("线程2: 执行完成" + LocalDateTime.now()); } },"有参wait线程").start(); new Thread(() -> { try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (lock) { System.out.println("唤醒所有线程"); lock.notifyAll(); } }).start(); }} 输出:线程1: 开始执行2022-04-12T12:34:34.317线程2: 开始执行2022-04-12T12:34:34.317唤醒所有线程线程2: 执行完成2022-04-12T12:34:35.295线程1: 执行完成2022-04-12T12:34:35.295

共同点:

 

  1. 无论是有参的wait方法还是无参的wait方法,它都可以使用当前线程进入休眠状态。

  2.无论是有参的wait方法还是无参的wait方法,它都可以使用notify / ontifyAll进行唤醒。

  

 

  

2. wait(0) 与 sleep(0)区别

public class WaitSleepDemo7 { public static void main(String[] args) { Object lock = new Object(); Thread t1 = new Thread(() -> { synchronized (lock) { System.out.println("线程1:开始执行"); try { lock.wait(0); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("线程1:执行结束"); } },"wait(0)"); t1.start(); Thread t2 = new Thread(() -> { System.out.println("线程2:开始执行"); try { Thread.sleep(0); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("线程2:执行结束"); }, "sleep(0)"); t2.start(); }}输出:线程1:开始执行线程2:开始执行线程2:执行结束

wait (0) : 无限期等待下去,相当于wait();

 

  sleep(0) :相当于Thread.yeild() , 让出CPU执行权,重新调度,但是sleep(0) 会继续执行。

  

 

  

3. wait 和sleep 释放代码

wait 和 sleep 在有所的情况下的锁处理行为是完全不同的:

 

  

public class WaitSleepDemo8 { public static void main(String[] args) throws InterruptedException { Object lock = new Object(); Object lock2 = new Object(); Thread t1 = new Thread(() -> { synchronized (lock) { System.out.println("线程1:开始执行"); try { lock.wait(3 * 1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("线程1:结束执行"); } }, "wait"); t1.start(); Thread t2 = new Thread(() -> { synchronized (lock2) { System.out.println("线程2:开始执行"); try { Thread.sleep(3 * 1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("线程2:结束执行"); } }, "sleep"); t2.start(); // 创建 2 个线程,先让线程休眠 1s 之后,尝试获取,看能不能获取到锁 // 如果可以获取到锁,说明休眠时线程是释放锁的,而如果获取不到锁,说明是不释放锁 Thread t3 = new Thread(() -> { try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("尝试获取 wait 方法的锁"); synchronized (lock) { System.out.println("成功获取 wait 的锁"); } }, "wait2"); t3.start(); Thread t4 = new Thread(() -> { try { TimeUnit.SECONDS.sleep(0); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("尝试获取 sleep 方法的锁"); synchronized (lock2) { System.out.println("成功获取 sleep 的锁"); } }, "sleep2"); t4.start(); }}输出:线程1:开始执行线程2:开始执行尝试获取 sleep 方法的锁尝试获取 wait 方法的锁成功获取 wait 的锁线程1:结束执行线程2:结束执行成功获取 sleep 的锁

wait方法(不管是有参还是无参)在执行的时候都会释放锁;而sleep 方法不会释放锁。

 

  

 

  

4. wait 与 sleep 区别

 

  

相同点:

1. 都是可以让线程进入休眠

 

  2. 都可以响应Interrupt(中断)请求

  

 

  

不同点:

1. wait必须配合synchronized一起使用;而sleep不需要。

 

  2. wait 属于Object(对象)的方法;而sleep属于Thread(线程)的方法。

  3. sleep 不释放锁;而wait释放锁。

  4. sleep 必须要传递一个数值类型的参数;而wait可以不传参。

  5. sleep 让线程进入到TIMED_WAITING状态;而无参的wait方法让线程进入了WAITING状态。

  6. 一般情况下,sleep只能等待超时时间之后再回复执行;而wait可以接受notify / notifiAll之后就绪执行。

  (MS):

  1.为什么 wait 释放锁⽽ sleep 不释放锁?

  【JVM 强制语法检查,wait ⽅法默认等待⽆期限】

  2.为什么 wait 要放在 Object 中?

  【wait 使⽤要加锁,也就是要操作锁,锁是针对对象级别的⽽⾮线程级别的,线程和对象是⼀对多,所以 wait 最便利的⽅式是放在 Object 中】

  到此这篇关于Java中wait与sleep的区别讲解(wait有参及无参区别)的文章就介绍到这了,更多相关javawait与sleep内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: