實現乙個容器,提供兩個方法,add,size
寫兩個執行緒,執行緒1新增10個元素到容器中,執行緒2實現監控元素的個數,當個數到5個時,執行緒2給出提示並結束
1.第一種方法是使用while一直監聽容器的數量變化,個數到達5就退出
缺點: list新增volatile之後,第二個執行緒能夠接到通知,但是,執行緒的死迴圈很浪費cpu
public class test1
public int size()
public static void main(string args) catch (interruptedexception e) }}
}.start();
new thread() }}
}.start();
}}
2.第二種方法是使用等待通知機制,這裡使用wait和notify做到,wait會釋放鎖,而notify不會釋放鎖
第乙個執行緒判斷個數不到5就wait 該執行緒停止執行並釋放鎖,第二個執行緒得以執行 把容器個數增加到5就呼叫notify喚醒執行緒1,這時候第二個執行緒要wait釋放鎖,讓第乙個執行緒執行,第乙個執行緒執行結束前,要呼叫notify喚醒第二個執行緒,讓第二個執行緒得以繼續執行
public class test2
public int size()
public static void main(string args) catch (interruptedexception e) }}
system.out.println("執行緒2結束");
}}.start();
new thread() catch (interruptedexception e1)
if(t.size() == 5) catch (interruptedexception e) }}
}system.out.println("執行緒1結束");
}}.start(); }
}
3.使用latch(門閂)替代wait notify來進行通知
好處是通訊方式簡單,同時也可以指定等待時間
使用await和countdown方法替代wait和notify
countdownlatch不涉及鎖定,當count的值為零時當前執行緒繼續執行
當不涉及同步,只是涉及執行緒通訊的時候,用synchronized + wait/notify就顯得太重了
這時應該考慮countdownlatch/cyclicbarrier/semaphore
public class test3
public int size()
public static void main(string args) catch (interruptedexception e)
}system.out.println("執行緒1結束");
}}.start();
new thread() }}
}.start();
}}
執行的結果
執行緒1啟動
執行緒2新增了0
執行緒2新增了1
執行緒2新增了2
執行緒2新增了3
執行緒2新增了4
執行緒1結束
執行緒2新增了5
執行緒2新增了6
執行緒2新增了7
執行緒2新增了8
執行緒2新增了9
執行緒問題1
func setlistview2info mesgp 0 重新整理listview2資訊,0 單執行緒 if guictrlread checkbox1 1 or guictrlread checkbox1 1 and guictrlread combo2 1 then 單執行緒準備資料 guic...
多執行緒經典問題1 主線程子執行緒交替問題
提出問題 子執行緒迴圈 10 次,接著主線程迴圈 100 次,接著又回到子執行緒迴圈 10 次,接著再回到主線程又迴圈 100 次。如此迴圈50次。分析 這個實際上是非常easy的問題。即子執行緒run,主線程堵塞 子執行緒堵塞,主線程run 可以使執行緒堵塞的方法有非常多,最常見的是sleep與w...
java執行緒相關問題1
一.thread.sleep 1.thread.sleep 函式就是幹這種事的,他告訴作業系統 在未來的多少毫秒內我不參與cpu競爭 2.而thread.sleep 0 的作用,就是 觸發作業系統立刻重新進行一次cpu競爭 競爭 的結果也許是當前執行緒仍然獲得cpu控制權,也許會換成別的執行緒獲得c...