【线程】sleep()方法和await()方法有什么区别?sleep()和yield()方法有什么区别?

sleep()是使线程暂停执行一段时间的方法。
await()也是一种使线程暂停执行的方法。
当线程交互时,如果线程对一个同步对象x发出wait()调用请求,那么该线程会暂停执行,被调对象进入等待状态,直到被唤醒或者等待超时。

具体来说sleep()方法和await()方法的区别主要表现在以下几个方面?

  1. 原理不同
    sleep()方法是Thread类的静态方法,是线程用来控制自身流程的,它会使线程暂停执行一段时间,而把执行机会让给其他线程,等到计时时间一到,此线程会自动被唤醒。
    例如:当线程执行报时功能时,每一秒钟打印出一个时间,那么此时就需要在打印方法前面加上一个sleep()方法,以便让自己每隔1s执行一次。

    wait()方法是Object类的方法,用于线程间通信,这个方法会使当前拥有该对象锁的线程等待,直到其他线程调用notify()方法或者notifyAll()方法才会被唤醒,不过也可以给线程指定时间被唤醒。
  2. 对锁的处理机制不同
    由于sleep()方法的主要作用是让线程暂停执行一段时间,时间一到则自动恢复,不涉及线程间通信,因此调用sleep()方法并不会释放锁。

    wait方法则不同,当调用wait()方法后,线程会释放掉它锁占用的锁,从而使线程所在对象中的其他synchronized数据可被别的线程使用。
  3. 使用区域不同
    由于wait()方法的特殊意义,因此它必须放在同步控制方法或者同步语句块中使用,而sleep()方法则可以放在任何地方使用

sleep()方法必须捕获异常,而wait()、notify()、notifyall()不需要捕获异常。在sleep的过程中,有可能被其他对象调用它的interrupt()、产生interruptedException异常。
由于sleep不会释放"锁标志",容易导致死锁问题的发生

sleep()和yield()方法有什么区别?

  1. sleep()方法在给其他线程运行机会时不考虑线程的优先级。因此会给低优先级的线程运行的机会,而yield()方法只会给相同优先级或更高优先级的线程运行的机会。
  2. 线程执行sleep()方法后会转入阻塞状态,所以执行sleep()方法的线程在指定的时间内肯定不会被执行,而yield()方法只是使当前线程重新回到就绪状态,所以执行yield()方法的线程有可能在进入到就绪状态后又立马被执行。

猜你喜欢

转载自blog.csdn.net/zhao_miao/article/details/90640552