執行緒問題 1

2021-08-10 13:27:10 字數 1749 閱讀 6630

實現乙個容器,提供兩個方法,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...