執行緒休眠 中斷 強制執行與禮讓分析

2021-09-27 13:32:42 字數 3316 閱讀 2966

1、從理論上來講,執行緒的優先順序越高越有可能先執行(越有可能先搶占資源)。thread類中針對於優先順序有兩個處理方法:

2、在進行優先順序定義的時候都是通過int型的數字來完成的,而對於此數字的選擇是在thread類中定義的。常量如下:

優先順序設定例項:

public

class

threaddemo};

thread threada =

newthread

(run,

"執行緒物件a");

thread threadb =

newthread

(run,

"執行緒物件b");

thread threadc =

newthread

(run,

"執行緒物件c");

threada.

setpriority

(thread.min_priority)

; threada.

setpriority

(thread.min_priority)

; threada.

setpriority

(thread.max_priority)

; threada.

start()

; threadb.

start()

; threadc.

start()

;// 執行結果:當x=0時,c一定先執行,a和b的執行順序不確定,之後abc執行緒的執行順序是隨機的

}}

1、休眠可以使乙個執行緒暫緩處理,休眠時間一到程式就會喚醒繼續執行,在thread類中定義的休眠方法如下:

2、在進行休眠的時候有可能會產生中斷異常「interruptedexception」,中斷異常屬於excepton的子類。

如果有多個執行緒物件,那麼休眠也是有先後順序的,例項如下:

public

class

threaddemo

catch

(interruptedexception e)}}

;// 產生5個執行緒物件

for(

int num =

0;num <

5;num++)}

}// 程式執行結果,看似程式物件是一起休眠的,一起自動喚醒的

// 但實際上不是,是有先後順序的,只是程式執行太快

// 執行緒物件-0、x=0

// 執行緒物件-3、x=0

// 執行緒物件-2、x=0

// 執行緒物件-1、x=0

// 執行緒物件-4、x=0

// 執行緒物件-0、x=0

// 執行緒物件-4、x=1

// 執行緒物件-2、x=1

// 執行緒物件-1、x=1

// 執行緒物件-3、x=1

// ......

程式執行使用圖例分析如下:

1、執行緒中斷指的是別人可以打斷自己某個執行緒的休眠,所有正在執行的執行緒都是被中斷的,中斷執行緒必須進行異常的處理。在thread類中提供有這種中斷執行的處理方法:

public

class

threaddemo

catch

(interrruptedexception e)

system.out.

printin

("休眠完畢");

}); thread.

start()

;// 開始休眠

thread.

sleep

(1000);

if(!thread.

isinterrupted())}}

執行緒強制執行指的是當滿足某些於某些條件之後,某乙個執行緒物件可以一直獨佔資源,一直到該執行緒的程式執行結束。

第一步:先觀察正常執行的程式

public

class

threaddemo},

"子執行緒");

thread.

start()

;// 產生5個執行緒物件

for(

int num =

0;num <

100;num++

)//執行結果:子執行緒與主線程一直搶占資源,主線程和子執行緒都在交替執行}}

第二步:讓主線程獨佔執行,使用thread類中的強制執行方法join()

public

class

threaddemo

system.out.

printin

(thread.

currentthread()

.getname()

+"、x= "

+x);}}

,"子執行緒");

thread.

start()

;// 產生5個執行緒物件

for(

int num =

0;num <

100;num++

)// 執行結果:當x=3的時候,就強制執行主線程,要主線程的所有程式執行完後才執行子執行緒

}}

1、執行緒禮讓指的是先將資源讓出去讓別的執行緒先執行,但每次禮讓執行的時候只禮讓一次。使用thread類中的yield()方法

禮讓例項:

public

class

threaddemo

system.out.

printin

(thread.

currentthread()

.getname()

+"、x= "

+x);}}

,"子執行緒");

thread.

start()

;// 產生5個執行緒物件

for(

int num =

0;num <

100;num++

)// 執行結果:如果x能被3整除,就讓主線程的程式執行一次再執行子執行緒的程式

}}

1、強制執行join()與禮讓yield()的區別如下:

以執行緒a和執行緒b為例,在執行執行緒a的時候,

若使用了jon(),那麼執行緒a就停止讓執行緒b先執行,一直到執行緒b的所有程式執行完畢後才能繼續執行執行緒;

若使用了yield(),那麼執行緒a就停止讓執行緒b執行,但是只會讓執行緒b執行一次,然後繼續執行執行緒a的程式。

強制中斷執行緒化threadirqs

kernel 提供了乙個命令列引數threadirqs,這個引數會讓irq 中斷強制執行在thread context,這個時候不管使用者是否 static int init setup forced irqthreads char arg early param threadirqs setup ...

多執行緒的強制執行

某些時候,我們需要強制優先執行某執行緒,可以使用join 方法 join long millis join long millis,int nanos 後兩個帶引數中的方法的作用是,指定合併時間,前者精確到毫秒,後者精確到納秒,意思是兩個執行緒合併指定的時間後,又開始分離,回到合併千的狀態。publ...

golang 程式休眠 golang 執行緒與通道

首先我們來看執行緒,在golang裡面也叫goroutine 下面我們先來看乙個例子吧 import fmt funcmain i fmt.println 2 上面的 就建立了乙個匿名函式,並且還傳入了乙個引數i,下面括號裡的i是實參,a是形參。那麼上面的 能按照我們預想的列印1 2 3嗎?告訴你們...