㈠ 線程進入阻塞時,線程會不會讓出CPU
那要看操作系統context switch的機制。
一般windows linux ios都會給定每個線程指定的執行時間,如果時間到了會出現計時器中斷信號(timer interrupt signal),而線程會被動丟失CPU的使用權。
而有些簡單的嵌入式系統沒有這個機制,context switch一般是要求線程主動放棄CPU使用權而交給kernel。如果這時候當前線程被阻塞那就會導致死循環,這時候要主動的叫reschele 或者 yield等函數給kernel發信號。
當然有timer的系統也可以叫這些函數要當前線程提早主動放棄CPU資源從而避免在循環里等待浪費時間。
㈡ 如何在線程中途讓出 cpu 使用權
線程調度 計算機通常只有一個CPU,在任意時刻只能執行一條機器指令,每個線程只有獲得CPU的使用權才能執行指令.所謂多線程的並發運行,其實是指從宏觀上看,各個線程輪流獲得CPU的使用權,分別執行各自的任務.在運行池中,會有多個處於就緒狀態的線程
㈢ Java線程的問題
main方法啟動程序後是運行在一個線程,你自己再創建兩個線程,做各自的任務,「結果不依賴當前CPU資源」這句話在這個上下文中的意思應該是指的不依賴運行程序所在的主線程。
㈣ 線程如何主動放棄CPU
1.如果只是想放棄當前線程的CPU時間片,可以用Sleep和SwitchToThread
1)線程可以調用Sleep函數使其在指定時間內不被調度:
VOID Sleep(DWORD dwMilliseconds);
Sleep調用會掛起當前線程,dwMilliseconds毫秒之後再將其恢復為可調度的。
Sleep函數有以下幾點值得注意:
a) 因為Windows並不是一個實時系統,dwMilliseconds只是一個建議值,因此Sleep調用時,系統掛起當前線程的時長大約是dwMilliseconds毫秒。比如,當dwMilliseconds設置為100時,在大多數情況下,當前線程睡眠的時長並不會是100ms,可能是幾百毫秒、幾秒、幾分鍾等等。
b) dwMilliseconds=INFINITE(-1)會使當前線程永遠睡眠,這通常沒什麼用處。
c) dwMilliseconds=0時,當前線程會放棄剩餘的時間片,系統會嘗試調度優先順序等於或高於當前線程 的可調度線程,如果沒有找到這樣的線程,系統將馬上重新調度調用Sleep的線程。
2)SwitchToThread 當前線程可以調用SwitchToThread強迫操作系統調度另外的可調度線程(如果存在)。
BOOL SwitchToThread();
當前線程調用SwitchToThread時,系統會檢查是否存在可調度的線程處於「飢餓」狀態,如果沒有找到,SwitchToThread立刻返回,系統繼續執行當前線程,否則系統將暫停當前線程並調度處於「飢餓」狀態的線程(無論該線程的優先順序大小),「飢餓」線程的調度時間大約是一個時間片,然後系統調度將恢復正常。
當線程A需要獲得某資源,而該資源又被另一優先順序較低的線程B佔用時,A可以調用SwitchToThread迫使操作系統調度低先級的進程,以期待B釋放被佔用的資源。當沒有其它線程可調度時,SwitchToThread返回FALSE,否則返回一個非0值。
SwitchToThread使用可參考http://hi..com/alizx/blog/item/1bd7468e6e1975e5f01f3601.html
SwitchToThread函數和Sleep(0)調用類似,不同之處在於SwitchToThread允許系統調度優先順序低於當前線程的可調度線程,但Sleep(0)只允許調度優先順序不低於當前線程的可調度線程。
2.上述兩個函數只是在當前調度內放棄CPU時間,如果你是要根據條件查詢的結果決定是否放棄時,可以採用
while(條件){Sleep(0);}
或while(條件){SwitchToThread();}
3.如果不想通過查詢的方式,可以採用非同步通知的方式。比如調用WaitForSingleObject某一事件(Event)這樣的阻塞函數,等待被置信。該函數首先在用戶空間檢查是否被置信。如果不是,則進入內核態放棄當前線程的CPU時間片,然後等待被外部置信;也可以直接SuspendThread自身,等待外部喚醒,原理和WaitForSingleObject類似。
4.如果想永久放棄時間片,可以讓線程結束,直接return 0;
㈤ 如何實現Java線程的暫停和重新啟用
JAVA中線程開始有start方法,暫停用sleep(time)方法,線程停止用stop方法,線程等待wait方法,java 中沒有線程重啟一說,只能說線程喚醒notifyAll()或是notify方法,前一個notifyAll()方法是喚醒所有的已休眠或是等待狀態下的線程。具體的一種參數請參照JDK文檔。
㈥ 基於java 線程的幾種狀態
下面是java 線程的5種狀態:
1、新建(new)
新建一個線程的對象。
2、可運行(runable)
線程對象創建後,其他線程調用該線程的start方法。或者該線程位於可運行線程池中等待被線程調用,已獲取cpu的使用權。
3、運行(running)
可運行的線程獲取了cpu的使用權,執行程序代碼
4、阻塞(block)
由於某些原因該線程放棄了cpu的使用權。停止執行。除非線程進入可運行的狀態,才會有機會獲取cpu的使用權。
(1)等待阻塞:運行中的線程執行wait方法,這時候該線程會被放入等待隊列。
(2)同步阻塞:運行中的線程獲取同步鎖,如果該同步鎖被別的線程佔用,這個線程會成被放入鎖池,等待其他線程釋放同步鎖。
(3)其他阻塞:運行的線程執行sleep或者join方法這個線程會成為阻塞狀態。當sleep超時,join等待線程終止,該線程會進入可運行狀態。
5、死亡(dead)
線程run mian 執行完畢後,或者因為某些異常產生退出了 run 方法,該線程的生命周期結束。
㈦ 多線程那裡太難 你們是怎麼學會的
並發需要用多線程實現。
web開發一般是不用多線程,不過個別特殊的功能可能要用。
因為yield只是使當前線程放棄cpu使用權。wait()方法會使當前線程放棄持有的鎖。
比較好的方法是用wait() notify()機制,但並不放鎖這種操作不好。
這有可能造成潛在的死鎖 - 當前線程佔用了鎖卻不運行,其他線程想運行卻拿不到鎖,也就是說在當前線程重新回到CPU上運行之前,其他線程都不能使用increment方法
這種操作不好。因為yield只是使當前線程放棄cpu使用權,但並不放鎖,也就是說在當前線程重新回到CPU上運行之前,其他線程都不能使用increment方法。 這有可能造成潛在的死鎖 - 當前線程佔用了鎖卻不運行,其他線程想運行卻拿不到鎖。 比較好的
在初學java時可以看javascript入門經典,之後你覺得基礎可以了就看javascript高級編程吧
㈧ 下面哪個方法使線程從運行狀態到阻塞狀態,但是不讓出資源
線程調度 計算機通CPU,任意刻能執行條機器指令每線程獲CPU使用權才能執行指令
所謂線程並發運行其實指宏觀看各線程輪流獲CPU使用權別執行各自任務
運行池處於緒狀態線程等待CPU,JAVA虛擬機項任務負責線程調度線程調度指按照特定機制線程配CPU使用權
兩種調度模型:調度模型搶占式調度模型
調度模型指讓所線程輪流獲cpu使用權並且平均配每線程佔用CPU間片比較理解
java虛擬機採用搶占式調度模型指優先讓運行池優先順序高線程佔用CPU運行池線程優先順序相同隨機選擇線程使其佔用CPU
處於運行狀態線程直運行直至放棄CPU
線程原放棄CPU
1 java虛擬機讓前線程暫放棄CPU轉緒狀態使其線程或者運行機
2 前線程某些原進入阻塞狀態 3 線程結束運行 需要注意線程調度跨平台 僅僅取決於java虛擬機依賴於操作系統
某些操作系統要運行線程沒遇阻塞放棄CPU;
某些操作系統即使線程沒遇阻塞運行段間放棄CPU給其線程運行機
java線程調度同啟線程能保證各線程輪流獲均等CPU間片
希望明確讓線程給另外線程運行機採取辦
調整各線程優先順序 讓處於運行狀態線程調用Thread.sleep() 讓處於運行狀態線程調用Thread.yield() 讓處於運行狀態線程調用另線程join()
㈨ java多線程有幾種狀態
新建(new)
新建一個線程的對象。
可運行(runable)
線程對象創建後,其他線程調用該線程的start方法。或者該線程位於可運行線程池中等待被線程調用,已獲取cpu的使用權。
運行(running)
可運行的線程獲取了cpu的使用權,執行程序代碼/
阻塞(block)
由於某些原因該線程放棄了cpu的使用權。停止執行。除非線程進入可運行的狀態,才會有機會獲取cpu的使用權。
1. 等待阻塞:運行中的線程執行wait方法,這時候該線程會被放入等待隊列。
2. 同步阻塞:運行中的線程獲取同步鎖,如果該同步鎖被別的線程佔用,這個線程會成被放入鎖池,等待其他線程釋放同步鎖。
3. 其他阻塞:運行的線程執行sleep或者join方法這個線程會成為阻塞狀態。當sleep超時,join等待線程終止,該線程會進入可運行狀態。
死亡(dead)
線程run mian 執行完畢後,或者因為某些異常產生退出了 run 方法,該線程的生命周期結束。