Executors创建的4种线程池的使用
Java通過(guò)Executors提供四種線程池,分別為:
newCachedThreadPool創(chuàng)建一個(gè)可緩存線程池,如果線程池長(zhǎng)度超過(guò)處理需要,可靈活回收空閑線程,若無(wú)可回收,則新建線程。
newFixedThreadPool 創(chuàng)建一個(gè)定長(zhǎng)線程池,可控制線程最大并發(fā)數(shù),超出的線程會(huì)在隊(duì)列中等待。
newScheduledThreadPool 創(chuàng)建一個(gè)定長(zhǎng)線程池,支持定時(shí)及周期性任務(wù)執(zhí)行。
newSingleThreadExecutor 創(chuàng)建一個(gè)單線程化的線程池,它只會(huì)用唯一的工作線程來(lái)執(zhí)行任務(wù),保證所有任務(wù)按照指定順序(FIFO, LIFO, 優(yōu)先級(jí))執(zhí)行。
注意:線程池只是為了控制應(yīng)用中處理某項(xiàng)業(yè)務(wù)中防止高并發(fā)問(wèn)題帶來(lái)的線程不安全的發(fā)生的概率。在我目前的測(cè)試用,還沒(méi)有發(fā)現(xiàn)線程可以重用這個(gè)概念,因?yàn)榫€程開啟后,用完就關(guān)閉了,不可以再次開啟的,查看源碼發(fā)現(xiàn)會(huì)每次新創(chuàng)建一個(gè)線程用來(lái)處理業(yè)務(wù)。我們可以通過(guò)線程池指定處理這項(xiàng)業(yè)務(wù)最大的同步線程數(shù),比如:Executors.newFixedThreadPool(3);在線程池中保持三個(gè)線程可以同時(shí)執(zhí)行,但是注意,并不是說(shuō)線程池中永遠(yuǎn)都是這三個(gè)線程,只是說(shuō)可以同時(shí)存在的線程數(shù),當(dāng)某個(gè)線程執(zhí)行結(jié)束后,會(huì)有新的線程進(jìn)來(lái)。newFixedThreadPool.execute(new?ThreadForpools());這句話的含義并不是添加新的線程,而是添加新的處理業(yè)務(wù)請(qǐng)求進(jìn)來(lái)。至少我當(dāng)前是這么理解的,沒(méi)有發(fā)現(xiàn)線程可以重復(fù)使用。
處理線程代碼:
package com.alivn.sockets; /*** Created by Alivn on 2017/3/19.*/ public class ThreadForpools implements Runnable{private Integer index;public ThreadForpools(Integer index){this.index=index;}@Overridepublic void run() {/**** 業(yè)務(wù)......省略*/try {System.out.println("開始處理線程!!!");Thread.sleep(index*100);System.out.println("我的線程標(biāo)識(shí)是:"+this.toString());} catch (InterruptedException e) {e.printStackTrace();}} }
(1) newCachedThreadPool
創(chuàng)建一個(gè)可緩存線程池,應(yīng)用中存在的線程數(shù)可以無(wú)限大
示例代碼如下:
package com.alivn.sockets; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /*** Created by Alivn on 2017/3/19.*/ public class Threadpools {/*** 我們獲取四次次線程,觀察4個(gè)線程地址* @param args*/public static void main(String[]args){ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();System.out.println("****************************newCachedThreadPool*******************************");for(int i=0;i<4;i++){final int index=i;newCachedThreadPool.execute(new ThreadForpools(index));}} }
輸出結(jié)果是:可以有無(wú)限大的線程數(shù)進(jìn)來(lái)(線程地址不一樣)
(2) newFixedThreadPool
創(chuàng)建一個(gè)定長(zhǎng)線程池,可控制線程最大并發(fā)數(shù),超出的線程會(huì)在隊(duì)列中等待。示例代碼如下:
package com.alivn.sockets; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /*** Created by Alivn on 2017/3/19.*/ public class Threadpools {/*** 我們獲取四次次線程,觀察4個(gè)線程地址* @param args*/public static void main(String[]args){//線程池允許同時(shí)存在兩個(gè)線程ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(2);System.out.println("****************************newFixedThreadPool*******************************");for(int i=0;i<4;i++){final int index=i;newFixedThreadPool.execute(new ThreadForpools(index));}} }
輸出結(jié)果:每次只有兩個(gè)線程在處理,當(dāng)?shù)谝粋€(gè)線程執(zhí)行完畢后,新的線程進(jìn)來(lái)開始處理(線程地址不一樣)
?
(3)? newScheduledThreadPool
創(chuàng)建一個(gè)定長(zhǎng)線程池,支持定時(shí)及周期性任務(wù)執(zhí)行。延遲執(zhí)行示例代碼如下:
package com.alivn.sockets; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit;/*** Created by Alivn on 2017/3/19.*/ public class Threadpools {/*** 我們獲取四次次線程,觀察4個(gè)線程地址* @param args*/public static void main(String[]args){ScheduledExecutorService newScheduledThreadPool = Executors.newScheduledThreadPool(2);System.out.println("****************************newFixedThreadPool*******************************");for(int i=0;i<4;i++){final int index=i;//延遲三秒執(zhí)行newScheduledThreadPool.schedule(new ThreadForpools(index),3, TimeUnit.SECONDS);}} }
執(zhí)行結(jié)果:延遲三秒之后執(zhí)行,除了延遲執(zhí)行之外和newFixedThreadPool基本相同,可以用來(lái)執(zhí)行定時(shí)任務(wù)
4) newSingleThreadExecutor
創(chuàng)建一個(gè)單線程化的線程池,它只會(huì)用唯一的工作線程來(lái)執(zhí)行任務(wù),保證所有任務(wù)按照指定順序(FIFO, LIFO, 優(yōu)先級(jí))執(zhí)行。示例代碼如下:
package com.alivn.sockets; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit;/*** Created by Alivn on 2017/3/19.*/ public class Threadpools {/*** 我們獲取四次次線程,觀察4個(gè)線程地址* @param args*/public static void main(String[]args){ExecutorService newSingleThreadExecutor = Executors.newSingleThreadExecutor();System.out.println("****************************newFixedThreadPool*******************************");for(int i=0;i<4;i++){final int index=i;newSingleThreadExecutor.execute(new ThreadForpools(index));}} }
?
執(zhí)行結(jié)果:只存在一個(gè)線程,順序執(zhí)行
from:?https://www.cnblogs.com/ljp-sun/p/6580147.html?
總結(jié)
以上是生活随笔為你收集整理的Executors创建的4种线程池的使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: AtomicInteger源码分析——基
- 下一篇: java并发编程--Executor框架