Ⅰ java Thread 的 sleep 和 wait 的區別
(1)sleep是讓線程休眠,必須給定休眠的時間,時間到了後自動醒來,不需要喚醒,休眠時不放棄cpu的執行權
(2)wait是讓線程等待,可以給時間,也可以不等時間,但是必須要喚醒才能醒來(使用notify或者notifyAll),等待時放棄cpu的執行權
(3)sleep方法是Thread類中定義的方法,wait是Object中定義的方法
(4)wait用在同步代碼塊或者同步方法中,sleep可以在任何地方使用
(5)sleep必須捕獲異常,wait不用捕獲異常
Ⅱ java線程,wait()方法怎麼把自己給停掉了
Thread.currentThread().wait() //引用當前的線程
Ⅲ java多線程關於Thread實例對象執行wait方法的問題
wait()方法只是讓當前線程(t1調用的,就是t1線程)在當前時間片不搶佔cpu,但下一個時間片該搶還是搶
正常都是子線程執行完,主線程才繼續執行,所以t1執行完,主線才會執行,而且是沒有障礙地執行
最後你那個同步鎖沒什麼用,因為沒有線程跟主線程搶著執行同步塊里的內容
Ⅳ Java Thread BLOCKED和WAITING兩種狀態的區別
BLOCKED狀態
線程處於BLOCKED狀態的場景。
當前線程在等待一個monitor lock,比如等待執行synchronized代碼塊或者使用synchronized標記的方法。
在synchronized塊中循環調用Object類型的wait方法,如下是樣例
synchronized(this)
{
while (flag)
{
obj.wait();
}
// some other code
}
WAITING狀態
線程處於WAITING狀態的場景。
調用Object對象的wait方法,但沒有指定超時值。
調用Thread對象的join方法,但沒有指定超時值。
調用LockSupport對象的park方法。
提到WAITING狀態,順便提一下TIMED_WAITING狀態的場景。
TIMED_WAITING狀態
線程處於TIMED_WAITING狀態的場景。
調用Thread.sleep方法。
調用Object對象的wait方法,指定超時值。
調用Thread對象的join方法,指定超時值。
調用LockSupport對象的parkNanos方法。
調用LockSupport對象的parkUntil方法。
Ⅳ java線程wait(),notify()問題,以下是代碼
把生產者的run方法這樣寫:
public void run() {
int n = 0;
while (n <= 10) {
n++;
q.put(n);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
其實沒什麼特殊的,我只似乎讓生產者每次生產出來一個東西之後稍稍睡一會,然後你在run一下看看效果,應該是每隔1s就會輸出一次,一共11次。
你的代碼本身沒有問題,問題在於要知道當put方法裡面notify的時候,你不會知道它會喚醒那個線程,這個完全是jvm看自己心情決定的,那麼就會出現的情況是生產者跑的飛快,它可能一下子就把11次循環都跑完,然後最後一次notify完了之後以後都不會在notify了,剩下一個消費者可憐巴巴的wait,可是永遠不會有人notify他了,然後就over了。
可能你不是很明白我說的意思,你按照我說的把代碼改一下,然後自己思考一下,這個東西會有一個頓悟的過程,可能你一時想不明白,但是將來可能一下子就明白我的意思了。
BTW,java多線程其實還是比較復雜的,讓各個線程在你的腦子裡面跑起來,你如果能在自己腦子裡面模擬多個線程一起跑,你就會比較容易想明白。
另外,多線程的代碼debug不能給你提供什麼幫助,我也有同事喜歡用debug調試多線程的程序,我對此頗為不屑,因為如果你在run裡面設置了斷點,那麼我可以說,你永遠都不會知道多線程是怎麼回事,一定要在自己腦子裡面想才行,實際上我讓線程sleep一會實際上相當於是加一個1s的斷點,1s後斷點取消,程序繼續跑,這個可以幫助你理解。
Ⅵ java thread wait問題
public class ThreadTest {
public static void main(String[] args) throws Exception{
Thread t = Thread.currentThread();
for(int i =0;i<20;i++){
if(i==12){
synchronized (t) {
try {
t.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
System.out.println("main---->"+i);
}
}
}
你用這代碼試試
你搞錯對象了
Ⅶ JAVA線程wait()方法問題
應該使用wait(),wait 方法的解釋是
Causes current thread to wait until another thread invokes the notify() method or the notifyAll() method for this object.
舉個例子:
比如你有一個Depository 類的對象 d ,然後線程A要訪問d的addLast()方法,
因為這個addLast()方法時synchronized 所以線程A進入的時候就給這個對象d 加上鎖,其它線程不允許訪問,當執行到wait()時,線程A就會先打開對象A的鎖,並在對象d 外面排隊等待。
對於IllegalMonitorStateException,我的理解是:
一個對象的wait()方法只能在此對象的同步方法中被調用,意思是,這個對象在wait前是被加了鎖的。
你將addLast方法的synchronized 去掉運行也會拋出這樣的異常。
所以說你用wait()就可以了。
Thread.currentThread().wait();這句話調用的是當前線程對象的wait()方法,
當前線程對象沒有被加鎖。所以出錯。
個人理解,僅供參考,希望能幫到你
Ⅷ java 的 Thread.sleep() 和 Thread.wait() 的區別
共同點: 他們都是在多線程的環境下,都可以在程序的調用處阻塞指定的毫秒數,並返回。
不同點: Thread.sleep(long)可以不在synchronized的塊下調用,而且使用Thread.sleep()不會丟失當前線程對任何對象的同步鎖(monitor);
object.wait(long)必須在synchronized的塊下來使用,調用了之後失去對object的monitor, 這樣做的好處是它不影響其它的線程對object進行操作。
Ⅸ java線程wait方法
wait和notify是用在多線程競爭同一鎖資源的情況下使用的。
你這段代碼實際是個單線程,這個線程自己把自己阻塞了,自然不可能自己把自己喚醒。
你的意圖怎麼實現呢?需要加入另外一個線程,下面是我仿照你的意圖寫的一段代碼,供參考下
publicclassA
{
publicA(){
finalAa=this;
Threadth1=newThread(){
@Override
publicvoidrun(){
//一直循環,去嘗試著喚醒a
try
{
this.sleep(10000);
}catch(InterruptedExceptione)
{
//TODOAuto-generatedcatchblock
e.printStackTrace();
}//為檢查是不是能真正實現喚醒a,等待10000毫秒,此時保證a已經處於等待狀態中。
while(true){
/**
*用notify喚醒的線程必須是持有當前鎖對象的線程
*/
synchronized(a){
a.notify();
}
}
}
};
th1.setDaemon(true);//這句也是必須的,將th1設為守護線程,保證在喚醒a以後,所有活動的線程都為守護線程,jvm能及時推出
th1.start();//和a.run的順序不可以換
this.run();
}
publicstaticvoidmain(String[]args)
{
newA();
}
publicvoidrun()
{
/**
*這里可以換成這樣,直接鎖住this就行了
*/
synchronized(this)
{
try
{
this.wait();//阻塞當前的線程
}catch(InterruptedExceptione)
{
//TODOAuto-generatedcatchblock
e.printStackTrace();
}finally{
System.out.println("1");//執行finally
}
}
}
}
Ⅹ 請教Java高人解答Java Thread,Wait的問題,問題如圖,多謝,紅色部分難以理解,請詳解!
這是一個很明顯的,線程不安全的問題
因為你在子線程里修改了這個 i 的值,也就是說,當你線程1 wait()的時候 i 的值還是大於0的
這時候線程2和線程3還是會繼續循環
結果線程2和線程3又wait()了等線程2notify()的時候,i的值已經是0了結果i--
然後是線程3又notify()了,這時候i的值本來已經是-1結果是-2了,很明顯的