執行緒池的學習和使用

2022-01-10 06:34:49 字數 2711 閱讀 9752

目錄執行緒池的作用是初始化一些執行緒,當有任務的時候,就從中啟動乙個來執行相關任務,執行完後,執行緒資源重新**到執行緒池中,達到復用的效果,從而減少資源的開銷

在jdk中,executors類已經幫我們封裝了建立執行緒池的方法。

executors.newfixedthreadpool();

executors.newcachedthreadpool();

executors.newscheduledthreadpool();

但是點進去看的話,

public static executorservice newfixedthreadpool(int nthreads)
它的內部實現還是基於threadpoolexecutor來實現的。通過阿里**規範外掛程式掃瞄會提示我們用threadpoolexecutor去實現執行緒池。通過檢視threadpoolexecutor的構造方法

public threadpoolexecutor(int corepoolsize,

int maximumpoolsize,

long keepalivetime,

timeunit unit,

blockingqueueworkqueue,

threadfactory threadfactory,

rejectedexecutionhandler handler)

我覺得有以下幾方面的原因。

可以靈活設定keepalivetime(當執行緒池中線程數大於corepoolsize的數m, 為這m個執行緒設定的最長等待時間 ),節約系統資源。

workqueue:執行緒等待佇列,在executors中預設的是linkedblockingqueue。可以理解是一種無界的陣列,當有不斷有執行緒來的時候,可能會撐爆機器記憶體。

可以設執行緒工廠,裡面新增自己想要的一些元素,只需要實現jdk的threadfactory類。

按照自己的業務設定合適的拒絕策略。策略有以下幾種

discardpolicy:默默丟棄無法載入的任務。

discardoldestpolicy:丟棄佇列中最老的,然後再次嘗試提交新任務。

public class nacossyncthreadfactory implements threadfactory 

public nacossyncthreadfactory()

@override

public thread newthread(runnable r)

}

public class mythreadpool 

public mythreadpool()

public threadpoolexecutor initthreadpool(threadfactory threadfactory, int threadnum, blockingqueue blockingqueue, rejectedexecutionhandler handler)

return new threadpoolexecutor(1, threadnum, 5, timeunit.seconds, blockingqueue, threadfactory, handler);

}}

初始化執行緒池類

mythreadpool mythreadpool = new mythreadpool();

threadpoolexecutor = mythreadpool.initthreadpool(

new nacossyncthreadfactory("nacos-sync"),

threadnum,

new arrayblockingqueue(10),

new threadpoolexecutor.discardpolicy()

);}

建立callable(futuretask)

/**

* 分頁獲取task資訊

* @return

*/private listgettask(int pagenum)

return taskipage.getrecords();

}// 執行任務

private futuretaskassembletaskfuture(task task) );

return futuretask;

}

執行任務(futuretask)

public void zksync() *****總頁數:{}", count, pagetotal);

for (int i = 1; i <= pagetotal; i++)

listcollect = tasklist.stream().map(task -> task.getid()).collect(collectors.tolist());

tasklist.foreach(task -> );

}threadpoolexecutor.shutdown();

}

使用執行緒和執行緒池

1 new thread的弊端 執行乙個非同步任務你還只是如下new thread嗎?new thread new runnable start 那你就out太多了,new thread的弊端如下 a.每次new thread新建物件效能差。b.執行緒缺乏統一管理,可能無限制新建執行緒,相互之間競爭...

執行緒池和程序池的使用

執行緒池和程序池模組 from concurrent.futures import threadpoolexecutor,processpoolexecutor python2版本 執行緒池 不支援 程序池 支援 python3版本 執行緒池 支援 程序池 支援 threadpoolexecutor...

JDK執行緒池和Spring執行緒池的使用

jd 程池和spring執行緒池例項,非同步呼叫,可以直接使用 1 jd 程池的使用,此處採用單例的方式提供,見示例 public class threadpoolutil public static executorservice getexecutorservice 在其它地方可以直接這樣使用 ...