sleep()方法和wait()方法的异同点

为什么 wait() 要放在同步代码块中?

步方法就是在方法前加关键字 synchronized,然后被同步的方法一次只能有一个线程进sleep()方法和wait()法的异同点

相同之处:

sleep()方法和wait()方法都是使当前线程进入休眠状态。 两者都可以响应**interrupt****中断,也就是说在线程调用方法进入休眠状态后,如果收到中断信号,都可以进行响应并中断,且都可以抛出InterruptException 异常。

不同之处:

 1,所属类不同

sleep() 方法属于 Thread 类的静态方法,而 wait() 方法属于Object类。
为什么 wait() 定义在 object 里,*而不是 Thread’//‘里?
Java 的锁是对象级别的锁,而不是线程级别,所以 wait()
Object 的方法。 sleep() 是线程级别的,所以存在于
Thread 类中。

2,唤醒方式不同

sleep() 方法必须传递一个超时时间的参数,过了这个时间后线程就会自动唤醒,进入就绪状态; wait() 方法可以不传递参数,此时线程会进入永久休眠,直到另一个线程调用notify() 方法或者 notifyAll() 方法之后,休眠的线程才会被唤醒。也就是说sleep() 方法可以 主动唤醒,而不传参的wait() 方法只能被动唤醒。

3,语法使用不同

入,其他线程等待;防止在 cpu 切换线程的时候,其它线程先执行了notify() ,后执行 wait() ,线程永远无法被唤醒, 所以要将wait() 放在同步代码块。

4,释放锁资源不同

在线程调用 wait() 方法时,线程会主动 释放 锁并进入等待状态; 而线程在调用sleep() 方法时,线程 不会释放锁   。 也就是说sleep() 方法是抱着锁睡的。

5,线程进入状态不同:

线程调用sleep() 方法会进入 TIMED_WAITING 有时限等待状态;而调用无参数的wait() 方法,线程会进入 WAITING 无时
限等待状态。

你可能感兴趣的:(java)