在中大型專案中,不可避免地需要執行非同步任務,而非同步任務的執行則是通過執行緒而執行的,因此掌握執行緒是如何建立的則是執行非同步任務的第一步。
我們知道,常見的建立執行緒的方式有:
繼承thread類,重寫run()方法
實現runnable介面,重寫run()方法
使用執行緒池建立執行緒
public
class
threadone
extends
thread
public
static
void
main
(string[
] args)
}
輸出:
當前執行緒:main二、實現runnable介面當前執行緒:thread-0執行了run方法
public
class
threadtwo
implements
runnable
}public
class
test
}
輸出:
當前執行緒:main當前執行緒:thread-0執行了run方法
為什麼使用執行緒池建立執行緒? 因為執行緒的建立和銷毀是非常消耗資源的,而執行緒池可以復用之前建立好的執行緒,因此減少了資源的消耗。1. threadpoolexecutor類的構造方法threadpoolexecutor構造方法
引數說明:
threadpoolexecutor執行流程:
建立threadpoolfactory工廠類:
public
final
class
threadpoolfactory
/** * 建立executorservice,單例模式(dcl)
* @return
*/public
static executorservice getexecutorservice()
}}return executor;
}/**
* 自定義執行緒工廠
*/private
static
class
customthreadfactory
implements
threadfactory
nameprefix = name +
"-"+ poolnumber.
getandincrement()
+"-thread-";}
@override
public thread newthread
(runnable r)
if(t.
getpriority()
!= thread.norm_priority)
return t;}}
}
測試:
public
class
threadpoolfactorytest);}}}
輸出:由於執行緒數量過大,觸發拒絕策略,丟擲異常。
blockingqueue的subtypes:
從構成關係圖可以看出,阻塞佇列的實現類主要有4種型別:
executors類建立執行緒池的方法歸根結底都是呼叫threadpoolexecutor類,只不過對每個方法賦值不同的引數去構造threadpoolexecutor物件。newcachedthreadpool:建立乙個可快取的執行緒池,如果執行緒池長度超過處理需要,可靈活**空閒執行緒,若無可**,則新建執行緒。
newfixedthreadpool: 建立乙個定長線程池,可控制線程最大併發數,超出的執行緒會在佇列中等待
newscheduledthreadpool: 建立乙個定長線程池,支援定時及週期性任務執行。
newsinglethreadexecutor:
建立乙個單執行緒化的執行緒池,它只會用唯一的工作執行緒來執行任務,保證所有任務按照指定順序(fifo, lifo, 優先順序)執行。
注意:執行緒池不允許使用executors去建立,而是通過threadpoolexecutor的方式建立。
原因:因為上述四個方法的建立的佇列大小預設都是integer.max_value,堆積過多的任務請求會可能導致oom。
什麼時候手動建立執行緒而不使用執行緒池
1 需要自定義執行緒的優先順序,執行緒池中線程總是normal 2 需要乙個前台執行緒,執行緒池中線程是後台執行緒 非ui執行緒最好使用執行緒池建立為後台執行緒,常常關閉乙個軟體之後,仍然占有記憶體,就是由於建立了多個前台執行緒,程式關閉的時候,還有其他前台執行緒沒有關閉。3 需要手動終止執行緒,執...
什麼時候手動建立執行緒而不使用執行緒池
1 需要自定義執行緒的優先順序,執行緒池中線程總是normal 2 需要乙個前台執行緒,執行緒池中線程是後台執行緒 非ui執行緒最好使用執行緒池建立為後台執行緒,常常關閉乙個軟體之後,仍然占有記憶體,就是由於建立了多個前台執行緒,程式關閉的時候,還有其他前台執行緒沒有關閉。3 需要手動終止執行緒,執...
boost建立執行緒池 boost庫使用 執行緒類
boost 庫中提供了兩種建立執行緒的方式,一種是單個執行緒建立,另外一種是執行緒組的建立,進行執行緒管理 thread 就是沒有組管理,與我們在linux下使用pthread create 函式是一樣的,只是在c 11中,引入了boost中的thread方法 包含標頭檔案 include usin...