更新時間:2020-07-17 16:12:41 來源:動力節(jié)點 瀏覽3497次
線程是程序開發(fā)的基礎(chǔ),在平時的開發(fā)中也是必不可少的,特別是對多線程和線程池都會經(jīng)常運用到。今天給大家介紹java中幾種常用的線程池,并了解每一種線程池的應用場景。
線程使用的demo
public?static?void?cache()?{
????????ExecutorService?pool?=?Executors.newCachedThreadPool();
????????long?start?=?System.currentTimeMillis();
????????pool.execute(()?->?{
????????????int?sum?=?0;
????????????for?(int?i?=?0;?i?<?10;?i++)?{
????????????????sum?=?(int)?Math.sqrt(i?*?i?-?1?+?i);
????????????????System.out.println(sum);
????????????}
????????});
????????System.out.println("cache:?"?+?(System.currentTimeMillis()?-?start));
????}
newCachedThreadPool
重用之前的線程
適合執(zhí)行許多短期異步任務的程序。
調(diào)用execute()將重用以前構(gòu)造的線程
如果沒有可用的線程,則創(chuàng)建一個新線程并添加到池中
默認為60s未使用就被終止和移除
長期閑置的池將會不消耗任何資源
源碼:
public?static?ExecutorService?newCachedThreadPool()?{
????????return?new?ThreadPoolExecutor(0,?Integer.MAX_VALUE,
??????????????????????????????????????60L,?TimeUnit.SECONDS,
??????????????????????????????????????new?SynchronousQueue());
????}
通過源碼可以看出底層調(diào)用的是ThreadPoolExecutor方法,傳入一個同步的阻塞隊列實現(xiàn)緩存。
下面說一下ThreadPoolExecutor
public?ThreadPoolExecutor(int?corePoolSize,
??????????????????????????????int?maximumPoolSize,
??????????????????????????????long?keepAliveTime,
??????????????????????????????TimeUnit?unit,
??????????????????????????????BlockingQueue?workQueue)?{
????????this(corePoolSize,?maximumPoolSize,?keepAliveTime,?unit,?workQueue,
?????????????Executors.defaultThreadFactory(),?defaultHandler);
????}
通過源碼可以看出,我們可以傳入線程池的核心線程數(shù)(最小線程數(shù)),最大線程數(shù)量,保持時間,時間單位,阻塞隊列這些參數(shù),最大線程數(shù)設(shè)置為jvm可用的cpu數(shù)量為最佳實踐
newWorkStealingPool
獲取當前可用的線程數(shù)量進行創(chuàng)建作為并行級別
使用ForkJoinPool
源碼:
public?static?ExecutorService?newWorkStealingPool()?{
????????return?new?ForkJoinPool
????????????(Runtime.getRuntime().availableProcessors(),
?????????????ForkJoinPool.defaultForkJoinWorkerThreadFactory,
?????????????null,?true);
????}
通過源碼可以看出底層調(diào)用的是ForkJoinPool線程池
下面說一下ForkJoinPool
public?ForkJoinPool(int?parallelism,
????????????????????????ForkJoinWorkerThreadFactory?factory,
????????????????????????UncaughtExceptionHandler?handler,
????????????????????????boolean?asyncMode)?{
????????this(checkParallelism(parallelism),
?????????????checkFactory(factory),
?????????????handler,
?????????????asyncMode???FIFO_QUEUE?:?LIFO_QUEUE,
?????????????"ForkJoinPool-"?+?nextPoolId()?+?"-worker-");
????????checkPermission();
????}
使用一個無限隊列來保存需要執(zhí)行的任務,可以傳入線程的數(shù)量,不傳入,則默認使用當前計算機中可用的cpu數(shù)量,使用分治法來解決問題,使用fork()和join()來進行調(diào)用。
以上就是動力節(jié)點java培訓機構(gòu)的小編針對“javase基礎(chǔ)入門教程之線程池的幾種應用場景”的內(nèi)容進行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業(yè)老師隨時為你服務。