這篇文章主要講解了“Java中有幾種線程池”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Java中有幾種線程池”吧!
成都創(chuàng)新互聯(lián)成立于2013年,先為茌平等服務(wù)建站,茌平等地企業(yè),進行企業(yè)商務(wù)咨詢服務(wù)。為茌平企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
線程池,顧名思義,放線程的池子嘛,這個池子可以存放多少線程取決于你自己采用什么樣的線程池,你的硬件資源,以及并發(fā)線程的數(shù)量。JDK提供了下面的四種線程池:
在Java中創(chuàng)建一個線程池,這很簡單,只需要兩行代碼。
ExecutorService executor = Executor.newFixedTreadPool(6);//固定線程是6
//線程一般設(shè)置成processor核心數(shù)的倍數(shù),因為我這臺機器是6核的,所以設(shè)成6。這也是充分利用硬件嘛
//執(zhí)行線程任務(wù)
executor.execute(new Runnable(){
@Override
public void run(){
//do nothing
}
})
executor.shutdown();
Executor是Java并發(fā)包中提供的,用來創(chuàng)造不同類型的線程池。
但是在多人合作或者是一些部署上線的項目里,是不允許去使用這種方法的,因為它是有性能隱患的。
Executors在創(chuàng)建線程池的時候,用的是new LinkedBlockingQueue
它的問題就在于來者不拒,只要有任務(wù)來,你就進隊列等著。在入隊列和出隊列用的并不是同一個lock,在多processor的機器上,是可以做到真正意義上的并行的。拿經(jīng)典的生產(chǎn)者和消費者來舉例子,在同一個時間點,有的在消費,有的在生產(chǎn)。
這種線程池不會銷毀線程,不會拒絕任務(wù),固定線程數(shù)。所以如果不停的加入任務(wù),會導(dǎo)致很糟糕的內(nèi)存占用,老年代可能會被占滿。
public static void main(String[] args) throws InterruptedException, ExecutionException {
TestThread testThread = new TestThread();
System.out.println(testThread.processors);
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(6);
FutureTask<String> futureTask = new FutureTask<>(new Callable<String>() {
@Override
public String call() throws Exception {
return Thread.currentThread().getName();
}
});
scheduledExecutorService.submit(futureTask);
//獲取返回值
String result = futureTask.get();
System.out.println("result :"+result);
//執(zhí)行延時任務(wù)
scheduledExecutorService.schedule(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+": bomb!");
}
},3L,TimeUnit.SECONDS);
}
Output:
result :pool-1-thread-1
pool-1-thread-1: bomb!
核心池大小為0,線程池最大線程數(shù)目為最大整型,這意味著所有的任務(wù)一提交就會wait。當(dāng)線程池中的線程有60s沒有執(zhí)行任務(wù)就會被Kill,阻塞隊列為SynchronousQueue。SynchronousQueue的take操作需要put操作等待,put操作需要take操作等待,否則會阻塞(線程池的阻塞隊列不能存儲,所以當(dāng)目前線程處理忙碌狀態(tài)時,會開辟新的線程來處理請求**),線程進入wait set。
總結(jié)一下這是一個可以無限擴大的線程池;適合處理執(zhí)行時間比較小的任務(wù);線程空閑時間超過60s就會被Kill,所以長時間處于空閑狀態(tài)的時候,這種線程池幾乎不占用資源,因為它壓根沒有線程在里面;阻塞隊列沒有存儲空間,只要請求到來,就必須找到一條空閑線程去處理這個請求,找不到則在線程池新開辟一條線程。
如果主線程提交任務(wù)的速度遠遠大于CachedThreadPool的處理速度,則CachedThreadPool會不斷地創(chuàng)建新線程來執(zhí)行任務(wù),這樣有可能會導(dǎo)致系統(tǒng)耗盡CPU和內(nèi)存資源,所以在使用該線程池時,要注意控制并發(fā)的任務(wù)數(shù)。如果是一個不斷增長的任務(wù)需求,很容易就會到性能瓶頸,它會不停的創(chuàng)建新的線程。
ExecutorService cachedThreadPool = Executors.newCachedThreadPool(); for (int i = 0; i < 10; i++) { cachedThreadPool.execute(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName()); } }); } cachedThreadPool.shutdown();
Output:
pool-1-thread-2
pool-1-thread-6
pool-1-thread-1
pool-1-thread-7
pool-1-thread-8
pool-1-thread-3
pool-1-thread-5
pool-1-thread-9
pool-1-thread-4
pool-1-thread-10
SingleThreadExecutor 是使用單個worker線程的Executor。只有一種情況會有新的線程加入線程池,那就是原有的線程運行時有拋出異常,這時就會有創(chuàng)建的新的線程來替代它的工作。
拿生產(chǎn)者消費者模型來說的話,這就是一個單一消費者的模型。
(ps.一般可以用來做一些日志記錄
public static void main(String[] args) { // 永遠是一條線程 ExecutorService singleThreadPool = Executors.newSingleThreadExecutor(); for (int i = 0; i < 10; i++) { final int j = i; singleThreadPool.execute(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName() + ":" + j); } }); } singleThreadPool.shutdown(); }
Output:
pool-1-thread-1:0
pool-1-thread-1:1
pool-1-thread-1:2
pool-1-thread-1:3
pool-1-thread-1:4
pool-1-thread-1:5
pool-1-thread-1:6
pool-1-thread-1:7
pool-1-thread-1:8
pool-1-thread-1:9
感謝各位的閱讀,以上就是“Java中有幾種線程池”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Java中有幾種線程池這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!
網(wǎng)頁題目:Java中有幾種線程池
新聞來源:http://muchs.cn/article48/pihhep.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、網(wǎng)站策劃、商城網(wǎng)站、定制開發(fā)、定制網(wǎng)站、域名注冊
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)