請使用執行緒池建立執行緒,而勿手動建立執行緒

2021-10-21 17:30:20 字數 2627 閱讀 4044

在中大型專案中,不可避免地需要執行非同步任務,而非同步任務的執行則是通過執行緒而執行的,因此掌握執行緒是如何建立的則是執行非同步任務的第一步。

我們知道,常見的建立執行緒的方式有:

繼承thread類,重寫run()方法

實現runnable介面,重寫run()方法

使用執行緒池建立執行緒

public

class

threadone

extends

thread

public

static

void

main

(string[

] args)

}

輸出:

當前執行緒:main

當前執行緒:thread-0執行了run方法

二、實現runnable介面

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...