线程在一定条件下会有不同的状态,具体状态有如下几种:
在阻塞状态和运行状态中有sleep()与wait()两个方法,那么这两个方法有什么去区别?
- sleep()属于Thread(线程)类的静态方法,而wait()来自Object类的成员方法
- 最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
- wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用但是sleep方法只能让当前线程睡眠。
- sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常
sleep()代码显示如下:
package com.sleepandwait;
public class Sleep {
public static void main(String[] args) {
new Thread(new Thread1()).start();//不需要处理异常
}
private static class Thread1 implements Runnable{
@Override
public void run(){
// synchronized (Sleep.class) {//sleep()方法可以不放在锁旗标里面影响不大
System.out.println("线程1开始");
System.out.println("线程1正在睡眠。。。");
try {
//在调用sleep()方法的过程中,线程不会释放对象锁。
Thread.sleep(5000);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("线程1正在进行。。。");
System.out.println("线程1结束!");
//Sleep.class.notify();
// }
}
}
}
运行效果如下:
wait()代码显示如下:
package com.sleepandwait;
/**
* @author ld
* 违法的监控状态异常:java.lang.IllegalMonitorStateException
* 当某个线程试图等待一个自己并不拥有的对象(O)的监控器
* 或者通知其他线程等待该对象(O)的监控器时,抛出该异常。
*/
public class Wait {
public static void main(String[] args) {
new Thread(new Thread2()).start();
try {//sleep需要捕捉异常
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private static class Thread2 implements Runnable{
@Override
public void run() {
synchronized (Wait.class) {//wait方法必须放在锁旗标里面,不放在锁旗标里会报违法的状态监控异常
System.out.println("线程2开始");
System.out.println("线程2正在等待。。。");
try {
Wait.class.wait(5000);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("线程2正在进行");
System.out.println("线程2结束!");
}
}
}
}
运行效果如下:
注意:
- 要正确导包,不然会一直报错代码没法正常运行。
- wait方法必须放在锁旗标里面,不然会出现异常。(java.lang.IllegalMonitorStateException)违法的监控状态异常。
- wait方法在运行一定要看清楚有没有唤醒方法或者设定时间,不然的话会一直锁死在开始和等待这一步,没法继续进行与结束。