Java中的sleep和wait是兩個常見的線程控制方法。但是它們在釋放資源方面有所不同。
首先我們來看sleep方法,它會讓當前線程休眠指定的時間,不會釋放對象鎖。例如:
synchronized(lock){ try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } //do something }
在這個例子中,如果有其他線程嘗試獲取lock,它們會被阻塞,直到當前線程休眠結束。但是,如果其他線程嘗試獲取lock之外的鎖,則不受影響,因為當前線程并沒有釋放任何鎖。
相反,wait方法會釋放對象鎖,直到被喚醒之前,當前線程會一直等待。例如:
synchronized(lock){ try { lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } //do something lock.notify(); }
在這個例子中,如果有其他線程嘗試獲取lock,它們會被阻塞,直到當前線程調用了lock.notify()方法喚醒它們。但是當前線程在調用wait方法之后,會釋放lock對象的鎖,讓其他線程有機會獲取lock對象的鎖。只有當其他線程獲取了lock對象的鎖,并且調用了lock.notify()方法之后,當前線程才會被喚醒。
綜上所述,sleep和wait在釋放資源方面存在差異。如果需要在等待某些條件滿足時釋放對象鎖,應該使用wait方法;如果希望線程休眠一段時間而不釋放任何鎖,則應該使用sleep方法。