Java线程池newSingleThreadExecutor newFixedThreadPool newCachedThreadPool newScheduledThreadPool
生活随笔
收集整理的這篇文章主要介紹了
Java线程池newSingleThreadExecutor newFixedThreadPool newCachedThreadPool newScheduledThreadPool
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Java線程池newSingleThreadExecutor newFixedThreadPool newCachedThreadPool newScheduledThreadPool
一、線程池的理解 ? ? ??線程池是預(yù)先創(chuàng)建線程的一種技術(shù),線程池在還沒(méi)有任務(wù)到來(lái)之前,事先創(chuàng)建一定數(shù)量的線程,放入空閑隊(duì)列中,然后對(duì)這些資源進(jìn)行復(fù)用,從而減少頻繁的創(chuàng)建和銷(xiāo)毀對(duì)象。 ? ? ? 系統(tǒng)啟動(dòng)一個(gè)新線程的成本是比較高的,因?yàn)樗婕芭c操作系統(tǒng)交互。在這種情形下,使用線程池可以很好地提高性能,尤其是當(dāng)程序中需要?jiǎng)?chuàng)建大量生存期很短暫的線程時(shí),更應(yīng)該考慮使用線程池。? ? ?與數(shù)據(jù)庫(kù)連接池類(lèi)似的是,線程池在系統(tǒng)啟動(dòng)時(shí)即創(chuàng)建大量空閑的線程,程序?qū)⒁粋€(gè)Runnable 對(duì)象或Callable 對(duì)象傳給線程池,線程池就會(huì)啟動(dòng)一個(gè)線程來(lái)執(zhí)行它們的run()或call()方法, 當(dāng)run()或call()方法執(zhí)行結(jié)束后, 該線程并不會(huì)死亡,而是再次返回線程池中成為空閑狀態(tài),等待執(zhí)行下一個(gè)Runnable對(duì)象的run()或call()方法。
? ? ?由于系統(tǒng)創(chuàng)建和銷(xiāo)毀線程都是需要時(shí)間和系統(tǒng)資源開(kāi)銷(xiāo),為了提高性能,才考慮使用線程池。線程池會(huì)在系統(tǒng)啟動(dòng)時(shí)就創(chuàng)建大量的空閑線程,然后等待新的線程調(diào)用,線程執(zhí)行結(jié)束并不會(huì)銷(xiāo)毀,而是重新進(jìn)入線程池,等待再次被調(diào)用。這樣子就可以減少系統(tǒng)創(chuàng)建啟動(dòng)和銷(xiāo)毀線程的時(shí)間,提高系統(tǒng)的性能。
二、線程池的使用 ? ? ??Jdk 1.5版本以上提供了現(xiàn)成的線程池。Java里面線程池的頂級(jí)接口是Executor, 是一個(gè)執(zhí)行線程的工具。線程池接口是ExecutorService。在Executor類(lèi)里面提供了一些靜態(tài)工廠,生成一些常用的錢(qián)程池:
? ? ?newSingleThreadExecutor:創(chuàng)建一個(gè)單線程的線程池。這個(gè)線程池只有一個(gè)線程在工作,也就是相當(dāng)于單線程串行執(zhí)行所有任務(wù)。如果這個(gè)唯一的線程因?yàn)楫惓=Y(jié)束,那么會(huì)有一個(gè)新的線程替代它。此線程池保證所有任務(wù)的執(zhí)行順序按照任務(wù)的提交順序執(zhí)行。
? ? ?newFixedThreadPool:創(chuàng)建固定大小的線程池,每次提交一個(gè)任務(wù)就創(chuàng)建一個(gè)線程,直到線程達(dá)到線程池的最大大小。線程池的大小一旦達(dá)到是大值就會(huì)保持不變。如果某個(gè)線程因?yàn)閳?zhí)行異常而結(jié)束,那么線程池會(huì)補(bǔ)充一個(gè)新線程。
? ? ?newCachedThreadPool:創(chuàng)建一個(gè)可緩存的線程池. 如果線程池的大小超過(guò)了處理任務(wù)所需要的線程,那么就會(huì)回收部分空閑(60秒不執(zhí)行任務(wù))的線程。當(dāng)任務(wù)數(shù)增加時(shí),此線程池又可以智能的添加新線程來(lái)處理任務(wù)。此線程池不會(huì)對(duì)錢(qián)程池大小做限制,線程池大小完全依賴于操作系統(tǒng)(或者說(shuō)JVM) 能夠創(chuàng)建的最大線程大小。
? ??newScheduledThreadPool:創(chuàng)建一個(gè)大小無(wú)限的線程池。此線程池支持定時(shí)以及周期性執(zhí)行任務(wù)的需求。 package javatest2;import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors;public class javatest2 {public static void main(String[] args) {// 創(chuàng)建一個(gè)單線程的線程池// ExecutorService es = Executors.newSingleThreadExecutor();// 創(chuàng)建一個(gè)固定大小的線程池// ExecutorService es = Executors.newFixedThreadPool(2);// 創(chuàng)建一個(gè)可緩存的線程池//ExecutorService es = Executors.newCachedThreadPool();// 創(chuàng)建一個(gè)大小無(wú)限的線程池ExecutorService es = Executors.newScheduledThreadPool(2);MyThread my1 = new MyThread();// 線程1es.execute(my1);MyThread my2 = new MyThread();// 線程2es.execute(my2);}}class MyThread implements Runnable {@Overridepublic void run() {for (int i = 0; i < 5; i++) {try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("MyThread:" + i);}} }
? ? ?注意使用線程池時(shí),Eclipse運(yùn)行時(shí),下圖中會(huì)顯示的紅框點(diǎn),因?yàn)榫€程池中的線程并沒(méi)有因?yàn)榭臻e而被銷(xiāo)毀,而普通線程執(zhí)行完后就銷(xiāo)毀了。
【尊重原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處】http://blog.csdn.net/guyuealian/article/details/51706310總結(jié)
以上是生活随笔為你收集整理的Java线程池newSingleThreadExecutor newFixedThreadPool newCachedThreadPool newScheduledThreadPool的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Eclipse导入android项目出现
- 下一篇: 解决ActionBar中的不显示View