當前位置:首頁 » 操作系統 » java線程調度演算法

java線程調度演算法

發布時間: 2022-09-01 22:17:45

『壹』 關於java多線程如何綁定CPU

  • CPU在某一個時間點上確實只能執行一個線程,但是多線程不是由於多核或者雙核才叫多線程。

  • 是由於,很多個線程在並行執行的時候,CPU根據一定的線程調度演算法,頻繁的進行線程切換,當正在執行的一個線程需要進行IO操作或者需要訪問內存的時候,CPU完全可以放棄該線程,轉而調度線程就緒隊列上的其他線程,被放棄的線程則進入阻塞狀態,IO操作或者訪問內存操作結束之後,該線程可以進入線程就緒隊列上。

  • 人們通常意義上的多線程指的是,由於CPU根據一定的線程調度演算法來切換線程,所以在一個時間段上,可以看做很多線程在並發執行。

  • 其實還是在某一個時間點上只有一個線程在運行罷了。

『貳』 Java多線程小程序錯誤,求解答

是2L說的和你現在出現的這個錯誤無關,我想1個時間片對於這個程序來說,是絕對可以把幾行代碼執行完的,從CPU指令的時間上也可以推出來。從上面可以非常明顯的看出來,關鍵是第一次輸出的問題,其實你的多線程代碼問題很多,但是在你這個程序里表現不出來。

為了解釋一些東西,先解釋一些概念。其實你說這個問題如果往深處說就復雜了,只能簡單的去說

時間片:CPU對線程的執行,是通過分配時間片來實現的,即每個線程每次運行都有一個時間限制,不能超過這個時間,這個時間的最大程度就是時間片(如果不考慮搶占的問題,時間片是一定的,即每個線程每次都運行一個完整的時間片的時間)

線程調度演算法:CPU對線程的調度,是有一個演算法來決定調度系統所有線程的先後順序(這里為了方便解釋,我全部認為是核心線程,而不存在用戶線程,用戶線程是通過進程間接調度的,即CPU並不知道有用戶線程存在,而核心線程是CPU直接知道的並且直接調度的)。那演算法是怎麼樣的,歷史上有無數種線程調度演算法,作為一個程序員,你只能認為是不可知的,即你要保證無論哪個線程先執行,程序都是一致的。這個演算法由操作系統決定。
取你的代碼的關鍵部分

SLEEP函數:這個函數到底做了什麼,兩件事,1放棄時間片立即讓操作系統進行下一次調度,2定時讓自己變得可以重新調度(你設定的時間內此線程是不可調度的)
Tsleep1 T1= new Tsleep1();
Tsleep2 T2= new Tsleep2();

T1.start();
T2.start();
你的程序里絕對T1會先執行完一次循環,這個基本是肯定的,因為要執行的操作肯定用不了半個時間片就足夠了,所以時間片造成的放棄調度的問題基本不太可能(針對你的代碼)。所以第一個輸出一定是輸出0,也確實這樣。

try{
sleep(1000);
}

好了,解釋輸出。

前者關鍵是下面的
0
This is i=0
This is i=1
1

0
This is i=0
1
This is i=1
在你T1第一次輸出0後,調用SLEEP放棄了時間片,這個時候T2運行輸出了This is i=0,這個過程不太可能有同步的問題,因為相對1S來說,時間片實在是太短了,而且你執行操作極少,基本保證了是原子的。
關鍵是第3行開始,現在經過前面的調度,T2進入睡眠了,為什麼現在反而T2先比T1先運行,明明是T2在睡眠嘛?原因是,你的兩個線程都是用戶級線程(一般核心級線程要顯示的指明,因為開銷過大),這種情況下,CPU是先調度進程,然後進程才決定讓誰先運行。在T2睡眠的時候,CPU調度其他進程,等到再次輪到你的進程的時候,T1和T2都已經「醒」了,這個時候操作系統要根據自己的演算法去決定,這個演算法並不是先進先出的,即使你T1先醒,T2後醒,但是兩者沒有優先順序的區別,操作系統視為平等,可以自由選擇調度哪一個。 並且,即使兩者都是核心級線程,也可能另外其他程序長期佔用了CPU而使得下一次調度的時候對兩者的調度發生細微的順序差異。所以即使你T1先START,T2後START,仍然無法保證以後T1先於T2,需要進行同步。同步使用信號量的方法就足夠了。

兩個線程共享全局變數i,初始化為0,自己同步就行了,反而效率更高些。別說面相對象就不使用全局變數,同步那絕對在多個線程之間避免不了共享。

偽代碼,只是表達意思,同時保證了每次操作是原子的也保證了順序,雖然2L保證了每次操作的原子性,但是沒能夠保證順序,當然,可能是看不出來效果的。
T1執行時首先
while{

if(i==0)
{
i++;
執行你想的操作
sleep(0);//放棄時間片就好了,沒必要等那麼久
}
else
{
sleep(0);//說明T1完後又再次先於T2被調度了,立即放棄時間片
}
}
對於T2

while{
if(i==1)
{
i--;
執行你想的操作
sleep(0)
}
else
{
sleep(0);//立即放棄時間片
}
}

『叄』 JAVA搶占式線程調度的問題

1線程的調度並不是由java決定的,而是os,os可以保證所有線程都有機會得到執行。即時某個線程正在忙。也會被休眠。具體的你要看os相關的線程調度這一塊,這叫搶占式任務調度。

2即使線程t的優先順序高,在調用start時,也不會保證線程已經真實的啟動。os只是把他放到了線程隊列中去排隊。而當前線程繼續執行。

『肆』 java線程調度的策略是什麼

時間片輪轉 加 優先順序
你可以這樣試
在一個線程里死循環輸出"1",
第二個輸出"2"
......
然後設置他們的優先順序,並且run.你可以看下屏幕上的輸出結果
屏幕跳得很快,但你應該能看清楚優先順序最高的那個數字...

『伍』 Java線程的知識要點

一、進程的概念

進程表示資源分配的基本單位,又是調度運行的基本單位。例如,用戶運行自己的程序,系統就創建一個進程,並給它分配資源,包括內存空間、磁碟空間、I/O設備等。然後,把該進程放入就緒隊列。進程調度程序選中它,為它分配CPU以及其他有關的資源,該進程才真正運行。所以,雲南電腦培訓http://www.kmbdqn.cn/發現進程是系統中的並發執行的單位。

二、線程的概念

線程:(英語:thread)是操作系統能夠進行運算調度的最小單位。它被包含在進程之中,是進程中的實際運作單位。一條線程指的是進程中一個單一順序的控制流,一個進程中可以並發多個線程,每條線程並行執行不同的任務。

三、引用線程的優勢

(1)易於調度。

(2)提高並發性。通過線程可方便有效地實現並發性。進程可創建多個線程來執行同一程序的不同部分或相同部分。

(3)開銷少。創建線程比創建進程要快,所需開銷很少。

(4)利於充分發揮多處理器的功能。通過創建多線程進程(即一個進程可具有兩個或更多個線程),每個線程在一個處理器上運行,從而實現應用程序的並發性,使每個處理器都得到充分運行。

四、進程與線程的關系

(1)一個線程只能屬於一個進程,而一個進程可以有多個線程,但至少有一個線程。

(2)資源分配給進程,同一進程的所有線程共享該進程的所有資源。

(3)處理機分給線程,即真正在處理機上運行的是線程。

(4)線程在執行過程中,要協作同步。不同進程的線程間要利用消息通信的辦法實現同步。

簡單來說:

1、一個程序至少有一個進程,一個進程至少有一個線程。

2、進程在執行過程中擁有獨立的資源,而多個線程共享進程中的資源。


『陸』 線程的調度分為幾種模型,在java中是使用哪種調度模型

Java程序屬於搶占式調度,哪個線程的優先順序高,哪個線程搶到的CPU時間片的概率就高;如果兩個線程同一個優先順序,則CPU隨機選擇一個執行。

『柒』 JAVA中實現多線程負載平衡演算法

將請求放到一個全局的隊列中去。每個子線程不斷地從隊列中取出請求並處理請求,如果隊列中沒有請求則子線程等待。

『捌』 java的多線程是OS調度還是JVM調度的呢

現在java線程和操作系統線程之間的對應關系有三種:
多對一、一對一、多對多

多對一就是所說的「Green thread」,一個java應用程序
被當作一個任務被操作系統調度,而這個java應用程序里
的多個線程則由虛擬機調度執行。也可以說由虛擬機選出
一個多線程java程序里的一個線程作為活動線程,這個線
程再作為操作系統的一個任務被操作系統調度。

一對一就是一個java線程對應一個操作系統線程了,即同
一個多線程java程序里的所有線程都由操作系統統一調度。

多對多還不是很明白。。。

『玖』 java多線程詳細理解

  • 多線程:指的是這個程序(一個進程)運行時產生了不止一個線程

  • 並行與並發:

  • 並行:多個cpu實例或者多台機器同時執行一段處理邏輯,是真正的同時。

  • 並發:通過cpu調度演算法,讓用戶看上去同時執行,實際上從cpu操作層面不是真正的同時。並發往往在場景中有公用的資源,那麼針對這個公用的資源往往產生瓶頸,我們會用TPS或者QPS來反應這個系統的處理能力。

  • 線程安全:經常用來描繪一段代碼。指在並發的情況之下,該代碼經過多線程使用,線程的調度順序不影響任何結果。這個時候使用多線程,我們只需要關注系統的內存,cpu是不是夠用即可。反過來,線程不安全就意味著線程的調度順序會影響最終結果,如不加事務的轉賬代碼:

  • 同步:Java中的同步指的是通過人為的控制和調度,保證共享資源的多線程訪問成為線程安全,來保證結果的准確。如上面的代碼簡單加入@synchronized關鍵字。在保證結果准確的同時,提高性能,才是優秀的程序。線程安全的優先順序高於性能。

熱點內容
編譯器錯誤都是什麼意思 發布:2024-04-28 17:31:30 瀏覽:73
伺服器不能復制粘貼到本機是怎麼回事 發布:2024-04-28 17:24:50 瀏覽:15
房產中介管理系統源碼 發布:2024-04-28 17:23:53 瀏覽:76
文件傳輸java 發布:2024-04-28 17:19:24 瀏覽:195
存儲過程中的is 發布:2024-04-28 17:13:45 瀏覽:406
c語言補碼函數 發布:2024-04-28 17:01:35 瀏覽:465
編譯原理聖經級書 發布:2024-04-28 16:48:21 瀏覽:146
我的世界手機版如何在伺服器上 發布:2024-04-28 16:35:21 瀏覽:862
pythonwindowsweb 發布:2024-04-28 16:10:29 瀏覽:542
王牌競速如何找到最開始的伺服器 發布:2024-04-28 14:53:09 瀏覽:403