執行緒技術討論

2022-07-05 10:00:15 字數 4884 閱讀 2574

一:執行緒的概念

多執行緒是個有意思的概念,乙個應用程式,比如酷我**或者某個遊戲,是乙個程序,然後cpu給該程序

分配記憶體空間,如果電腦記憶體空間有限,而且執行的程式比較多時就會比較卡,乙個程序可能有多個執行緒

執行,比如遊戲中,多個任務,建築物等都是執行緒在操作,在單核處理器的情況下,是併發執行的,cpu給

每個執行緒隨機分配時間片,得到時間片的那個任務執行,由於切換的頻率比較快,所以使用者看起來是一起

執行的。在多核處理器的情況下,是並行的,確實可以一起執行,所以多執行緒的好處就是不必考慮電腦是否多核,

確實可以提高執行效率。

下面看乙個簡單的例子如下:

//實現倒計時功能

class countdown implements runnable

public countdown(int countdown)

public string getstatus()

@override

public void run()

}}

實現乙個簡單的倒計時功能,countdown用來計數,id用來標記訪問例項,在main方法中呼叫run:

public class testthread2 

}

執行結果:

#0(9)

#0(8)

#0(7)

#0(6)

#0(5)

#0(4)

#0(3)

#0(2)

#0(1)

#0(liftoff!)

順序執行,實際上上面的執行並沒有涉及到執行緒,計數的執行都是在main執行緒中執行的,如果想實現多執行緒執行,就必須

把上面的任務依附到某個執行緒上。

二:建立執行緒的兩種方式

1:繼承thread

// 建立執行緒方式一

class mythread extends thread

}}

public class testthread1 	}	

}

thread-0:::0

thread-0:::1

thread-0:::2

main:::0

thread-0:::3

thread-0:::4

thread-0:::5

thread-0:::6

thread-0:::7

thread-0:::8

thread-0:::9

main:::1

main:::2

main:::3

main:::4

main:::5

main:::6

main:::7

main:::8

main:::9

從執行結果可以看出,main執行緒和thread0執行緒隨機獲取cpu時間片執行任務!

//建立執行緒方式二

class myrun implements runnable

}}

public class testthread1 	}	

}

main:::0

thread-0:::0

thread-0:::1

main:::1

thread-0:::2

thread-0:::3

main:::2

thread-0:::4

thread-0:::5

main:::3

thread-0:::6

main:::4

main:::5

main:::6

main:::7

thread-0:::7

thread-0:::8

thread-0:::9

main:::8

main:::9

執行結果類似上面,所以也是多執行緒執行

三:執行緒池的使用

如果需要執行主線程之外的執行緒時,可以用上面的方式建立執行緒,但是如果併發的任務比較多時,頻繁的建立和銷毀執行緒會消耗過多的資源

所以最好的選擇是使用執行緒池,在使用的時候由執行緒池分配,使用完成由執行緒池**掉

1:沒有返回值的執行緒池

newcachedthreadpool 、newfixedthreadpool、newsinglethreadpool這是幾種常見的執行緒池,第一種是執行緒池是無界的,但是記憶體

的資源是有限的,一般會有限制,第二種是固定長度執行緒池,在建立執行緒池的時候就指定執行緒的長度,第三種只會建立乙個執行緒,如果第二種

的引數為1就是第三種

public static void main(string args) 

service.shutdown();

}

#0(9)

#0(8)

#0(7)

#0(6)

#0(5)

#0(4)

#0(3)

#0(2)

#0(1)

#0(liftoff!)

#2(9)

#2(8)

#1(9)

#1(8)

#1(7)

#1(6)

#1(5)

#1(4)

#1(3)

#1(2)

#1(1)

#1(liftoff!)

#4(9)

#4(8)

#4(7)

#4(6)

#4(5)

#4(4)

#4(3)

#4(2)

#4(1)

#4(liftoff!)

#2(7)

#2(6)

#2(5)

#2(4)

#2(3)

#2(2)

#2(1)

#2(liftoff!)

#3(9)

#3(8)

#3(7)

#3(6)

#3(5)

#3(4)

#3(3)

#3(2)

#3(1)

#3(liftoff!)

從執行結果可以看出,隨機放入5個執行任務到執行緒池中,然後這5個任務隨機搶奪cpu的執行權

newfixedthreadpool和newcachethreadpool的用法比較類似,cache是第一選擇,如果有問題可以選擇fixed,對於第三種

newsinglethreadpool,只有乙個執行緒,如果對給它太多的任務,它會阻塞,然後順序執行每乙個任務:

public static void main(string args) 

service.shutdown();

}

#0(9)

#0(8)

#0(7)

#0(6)

#0(5)

#0(4)

#0(3)

#0(2)

#0(1)

#0(liftoff!)

#1(9)

#1(8)

#1(7)

#1(6)

#1(5)

#1(4)

#1(3)

#1(2)

#1(1)

#1(liftoff!)

#2(9)

#2(8)

#2(7)

#2(6)

#2(5)

#2(4)

#2(3)

#2(2)

#2(1)

#2(liftoff!)

#3(9)

#3(8)

#3(7)

#3(6)

#3(5)

#3(4)

#3(3)

#3(2)

#3(1)

#3(liftoff!)

#4(9)

#4(8)

#4(7)

#4(6)

#4(5)

#4(4)

#4(3)

#4(2)

#4(1)

#4(liftoff!)

這是沒有返回值的執行緒池的用法,這種方式在需要非同步呼叫的時候使用,同步呼叫的時候需要用到有返回值的執行緒池

2:有返回值的執行緒池

如果想讓多執行緒執行完畢後,將結果返回,則需要實現callable而不是runnable,重寫call()方法,而不是run()方法

//建立有返回值的執行緒池

class mycall implements callable

@override

public integer call() throws exception

}

public class testthread3 

for(futurefuture:result) catch (interruptedexception | executionexception e) finally

} }

}

012

34

多執行緒執行完任務後,最後將結果返回,其中get()會阻塞執行緒,起到計數器的作用,如果有乙個執行緒沒有執行完畢,那麼就會一直阻塞

不會結束。

模擬如下:

修改call()方法**如下:

public integer call() throws exception 

return id;

}

那麼在執行的時候,就會在id=3處阻塞,3後面的任務都不會執行,直到3執行結束。

今天多執行緒的知識就總結到這裡了,後面繼續......

各種直播技術討論

from 每一種協議都有他生存的環境,就像安防不能沒有rtsp,因為安防行業很多程式都已經是寫的rtsp協議支援,要改就要改平台,要麼就換支援rtsp協議的裝置,那麼你做為攝像機廠商,你到底是支援還是不支援rtsp呢?千千萬萬的開發商和整合商程式都寫好了,預設都是按照你裝置支援rtsp的標準做的平台...

技術討論 關於低耦合開發的討論

技術討論 關於低耦合開發的討論 丁丁 15 15 50 求知誰體會過低耦合帶來的好處我怎麼覺得現在接觸到的專案都是遷一發 動全身呢 青潤 15 17 03 你是全新專案,還是歷史專案改造?丁丁 15 17 19 新的繼承抽象和介面的方式完全體現不出多麼易於修改 丁丁 15 18 38 只要有變更涉及...

SSO技術應用再討論

近日學習研究了sso,有很多疑問想與大家交流。之前發了帖效果不佳,疑惑依然存在。今日將自創的sso應用方案整理出來,算是拋磚引玉,希望通過交流分析出最佳的應用模式,互進共勉。目標 整合現有郵件系統 論壇系統 部落格系統,實現單點登陸。面臨問題 跨域 應用系統由不同的開發語言編寫 如jsp asp p...