Java中wait和sleep方法的区别

坚持每天写博文,积累下开发中的点点滴滴
Java中的多线程是一种抢占式的机制而不是分时机制。
线程主要有以下几种状态:
就绪(Runnable):线程准备运行,不一定立马就能开始执行。

运行中(Running):进程正在执行线程的代码。

等待中(Waiting):线程处于阻塞的状态,等待外部的处理结束。

睡眠中(Sleeping):线程被强制睡眠。

I/O阻塞(Blocked on I/O):等待I/O操作完成。

同步阻塞(Blocked on Synchronization):等待获取锁。

死亡(Dead):线程完成了执行。

  • 抢占式机制

指的是有多个线程处于可运行状态,但是只有一个线程在运行;每个对象都有一个机锁来控制同步访问。Synchronized关键字可以和对象的机锁交互,来实现线程的同步。


由于sleep()方法是Thread类的方法,因此它不能改变对象的机锁。所以当在一个Synchronized方法中调用sleep()时,线程虽然休眠了,但是对象的机锁没有被释放,其他线程仍然无法访问这个对象。
而wait()方法则会在线程休眠的同时释放掉机锁,其他线程可以访问该对象。
一个线程结束的标志是:run()方法结束。
Wait()方法和notify()方法:当一个线程执行到wait()方法时(线程休眠且释放机锁),它就进入到一个和该对象相关的等待池中,同时失去了对象的机锁。当它被一个notify()方法唤醒时,等待池中的线程就被放到了锁池中。该线程从锁池中获得机锁,然后回到wait()前的中断现场。


  • Yield()方法

是停止当前线程,让同等优先权的线程运行。如果没有同等优先权的线程,那么Yield()方法将不会起作用。

  • join()方法

使当前线程停下来等待,直至另一个调用join方法的线程终止。
值得注意的是:线程的在被激活后不一定马上就运行,而是进入到可运行线程的队列中。

  • wait和sleep方法的区别
    1. sleep方法只让出了CPU,而并不会释放同步资源锁
      wait()方法则是指当前线程让自己暂时退让出同步资源锁,以便其他正在等待该资源的线程得到该资源进而运行,只有调用了notify()方法,之前调用wait()的线程才会解除wait状态
    2. sleep()方法可以在任何地方使用;wait()方法则只能在同步方法或同步块中使用;
    3. sleep()是线程线程类(Thread)的方法,
      wait()是Object的方法
    4. sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章