线程sleep()与wait()的区别

线程在一定条件下会有不同的状态,具体状态有如下几种:

在这里插入图片描述
在阻塞状态和运行状态中有sleep()与wait()两个方法,那么这两个方法有什么去区别?

  1. sleep()属于Thread(线程)类的静态方法,而wait()来自Object类的成员方法
  2. 最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
  3. wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用但是sleep方法只能让当前线程睡眠。
  4. 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结束!");
			}
		}
}

}

运行效果如下:
在这里插入图片描述

注意:

  1. 要正确导包,不然会一直报错代码没法正常运行。
  2. wait方法必须放在锁旗标里面,不然会出现异常。(java.lang.IllegalMonitorStateException)违法的监控状态异常。
  3. wait方法在运行一定要看清楚有没有唤醒方法或者设定时间,不然的话会一直锁死在开始和等待这一步,没法继续进行与结束。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值