多執行緒的一些小問題集錦

2021-06-14 12:35:57 字數 1846 閱讀 6744

測試執行緒是否已經死亡,可以呼叫isalive()方法.當執行緒處於就緒、執行、阻塞三種狀態時,返回true;當執行緒處於死亡、新建狀態時返回false。

例項**如下:

package com.thread;

public class startdead extends thread

} public static void main(string args)

//只有當執行緒處於新建、死亡兩種狀態時,isalive()返回false

if(i>20&&!sd.isalive()) catch (exception e) }

} }}

執行上面**我們可以發現,對已經死亡的執行緒,呼叫start()方法會丟擲異常!

注意:不要對已經死亡的執行緒呼叫start()方法,程式只能對新建狀態的執行緒呼叫start()方法,對新建執行緒兩次呼叫start()方法也是錯誤的!

2.1  join()方法

join()方法有三種過載方式。

join(): 等待被join的執行緒執行完成.

join(long millis) :等待被join的時間最長為 .. millis。如果在..millis內,被join()的執行緒還沒有完成,講不再等待.

join(long millis,int nanos):等待被join的執行緒最長為..millis毫秒加上nanos微秒.

好吧,來個具體的例子看看下:

package com.thread; 

public class jointhread catch (interruptedexception e)

}system.out.println(thread.currentthread().getname()+" "+i);}}}

class myjointhread implements runnable

}}

輸出的結果如下,每次執行都不一樣:

新執行緒  14

main 16

main 17

main 18

main 19

新執行緒 15

新執行緒 16

新執行緒 17

新執行緒 18

新執行緒 19

新執行緒 20

新執行緒 21

新執行緒 22

新執行緒 23

新執行緒 24

新執行緒 25

新執行緒 26

被join的執行緒 0

新執行緒 27

被join的執行緒 1

被join的執行緒 2

由上述結果可以看出,當主線程的i=20的時候,主線程阻塞,直到被join的執行緒執行完才可以!在i=20之前,「新執行緒」和"main"執行緒交替執行,i=20之後,「新執行緒」和「join執行緒交替執行」.

2.2.後台執行緒

如果將某個執行緒設定為後台執行緒,必須在該執行緒啟動之前設定,也就是說start()方法必須在setdaemon(true)方法之後,否則會丟擲異常!

2.3 執行緒睡眠

static void sleep(long millis)  ,讓當前正在執行的執行緒暫停millis毫秒,並進入阻塞狀態。呼叫sleep()不會釋放物件鎖!

package com.thread;

public class threadsleep

}class mysleep implements runnable catch (interruptedexception e)

} } }

還有其它的一些小問題,有時間再補充吧!

一些小問題

1 曼徹斯特編碼和差分曼徹斯特編碼。曼徹斯特編碼,常用於區域網傳輸。在曼徹斯特編碼中,每一位的中間有一跳變,位中間的跳變既作時鐘訊號,又作資料訊號 從高到低跳變表示 1 從低到高跳變表示 0 還有一種是差分曼徹斯特編碼,每位中間的跳變僅提供時鐘定時,而用每位開始時有無跳變表示 0 或 1 有跳變為 ...

一些小問題

問1 子類繼承了父類的所有成員,對嗎?答1 錯,至少子類沒有繼承父類的建構函式 析構函式不知有沒有繼承,但複製建構函式肯定是繼承了 class a a intx a const a a a operator const a a class b public a intmain view code 問...

一些小問題

最近使用win10出現了很多問題,簡單總結一二。第一,剛建登陸使用者時,使用者名稱搞成了中文的,於是乎eclipse中 總是報錯,想改名發現改不了,必須先將家庭版公升級為專業版才可以建立乙個admin許可權的賬戶登入,然後修改c users 張三中的張三為英文。第二,我的電腦不在桌面上,進去麻煩,要...