多執行緒學習筆記7之執行緒池

2021-10-02 09:04:28 字數 2446 閱讀 7851

executors

建立執行緒池的類,提供四種執行緒池:

public class callabledemo 

}

callable

callable是乙個任務,類似於runnable,但是callable任務是有返回值的,一般用執行緒池去執行這個callable任務,返回乙個包含callable執行結果的future,這個操作是非同步的,然後通過future.get()這個阻塞方法去獲取執行結果

future

儲存執行任務產生的結果

futuretask

代替callable任務+future,futuretask實現了runnablefuture介面,而runnablefuture介面同時繼承了runnable和future介面(介面可以同時繼承2個以上介面),所以futuretask本身就是乙個任務和future,簡單使用如下

public class futuretaskdemo ); //new callable () 

new thread(task).start();//這裡也可以用執行緒池

//阻塞

system.out.println(task.get());}}

completablefuture

用來管理多個future的結果,簡單使用如下

public class completablefuturedemo 

private static double priceoftm()

private static double priceoftb()

private static double priceofjd()

private static void delay() catch (interruptedexception e)

system.out.printf("after %s sleep!\n", time);}}

threadpoolexecutor及七個引數

建立執行緒池構造方法7個引數,如下圖

基於陣列的有界阻塞佇列,按fifo排序。新任務進來後,會放到該佇列的隊尾,有界的陣列可以防止資源耗盡問題。當執行緒池中線程數量達到corepoolsize後,再有新任務進來,則會將任務放入該佇列的隊尾,等待被排程。如果佇列已經是滿的,則建立乙個新執行緒,如果執行緒數量已經達到maxpoolsize,則會執行拒絕策略。

②linkedblockingquene

基於鍊錶的無界阻塞佇列(其實最大容量為interger.max),按照fifo排序。由於該佇列的近似無界性,當執行緒池中線程數量達到corepoolsize後,再有新任務進來,會一直存入該佇列,而不會去建立新執行緒直到maxpoolsize,因此使用該工作佇列時,引數maxpoolsize其實是不起作用的。

③synchronousquene

乙個不快取任務的阻塞佇列,生產者放入乙個任務必須等到消費者取出這個任務。也就是說新任務進來時,不會快取,而是直接被排程執行該任務,如果沒有可用執行緒,則建立新執行緒,如果執行緒數量達到maxpoolsize,則執行拒絕策略。

④priorityblockingqueue

具有優先順序的無界阻塞佇列,優先順序通過引數comparator實現

建立乙個新執行緒時使用的工廠,可以用來設定執行緒名、是否為daemon執行緒等等

①callerrunspolicy

該策略下,在呼叫者執行緒中直接執行被拒絕任務的run方法,除非執行緒池已經shutdown,則直接拋棄任務。

②abortpolicy

該策略下,直接丟棄任務,並丟擲rejectedexecutionexception異常。

③discardpolicy

該策略下,直接丟棄任務,什麼都不做。

④discardoldestpolicy

該策略下,拋棄進入佇列最早的那個任務,然後嘗試把這次拒絕的任務放入佇列

簡單使用**如下:

public class threadpoolexecutordemo 

@override

public void run() catch (ioexception e)

}@override

public string tostring() ';}}

public static void main(string args)

system.out.println(tpe.getqueue());

tpe.execute(new task(100));

system.out.println(tpe.getqueue());

tpe.shutdown();

}

執行緒池 多執行緒學習筆記(三)

執行緒池產生原因 建立很多執行緒造成的兩個問題 1.構建乙個新的執行緒會涉及到與作業系統的互動,會消耗一定的系統資源,當使用完這些新建立的執行緒後,執行緒就會被銷毀,然後當我們再建立的時候就會再次消耗系統資源,所以如果建立很多生命期很短的執行緒,就會消耗很大的系統資源,甚至給系統帶來很大的壓力。2....

Java多執行緒學習之 執行緒池

一 executor s及其executorservice 二 executors工廠建立執行緒池 三 threadpoolexecutor建立執行緒池 executors底層是通過threadpoolexecutor實現的。建議使用threadpoolexecutor實現自定義執行緒池 publi...

多執行緒程式設計學習筆記 執行緒池(三)

接上文多執行緒程式設計學習筆記 執行緒池 一 接上文 多執行緒程式設計學習筆記 執行緒池 二 執行緒池還有乙個threadpool.registerwaitforsingleobject,這個方法允許我們將 函式放入執行緒池中的佇列中。當提供的等待事件處理器接收到訊號或發生超時時,這個 函式將被呼叫...