1. 程式人生 > >Java四種執行緒池的使用

Java四種執行緒池的使用

http://cuisuqiang.iteye.com/blog/2019372

http://www.cnblogs.com/riskyer/p/3263032.html

http://blog.csdn.net/mazhimazh/article/details/19243889

         Sun在java5中,對Java執行緒的類做了大量的擴充套件,其中執行緒池就是Java5的新特性之一,除了執行緒池外,還有很多執行緒相關的內容,為多執行緒的程式設計帶來了惡極大的便利,為了編寫高效穩定的多執行緒,執行緒部分的新增內容顯得尤為重要,          執行緒池的基本思想還是一種物件池的思想,開闢一塊記憶體空間,裡面存放了總舵(未死亡)的執行緒,池中執行緒執行排程由池管理器來處理。當有執行緒任務時,從池中取一個,執行完成後執行緒物件歸池,這樣可以避免反覆建立執行緒物件帶來的效能開銷,節省了系統的資源
         在Java5之前,要實現一個執行緒池相當有難度,現在Java5為我們做好了一切,我們只需要按照提供的API來使用,就可享受執行緒池帶來的極大便利。          Java5的執行緒池分為多種:固定尺寸的執行緒池、可變長度的連線處,。

Java通過Executors提供四種執行緒池,newCacheThreadPool(),newFixedThreadPool(),newScheduedThreadPool(),newSingleThreadPool()

newCacheThreadPool(), 建立一個可快取的執行緒池,如果執行緒池長度超過處理需要,可靈活回收空閒執行緒,如果執行緒池長度小於處理需求,則新建執行緒
 newFixedThreadPool(),建立一個定長的執行緒池,可控制現場最大併發數,超出的執行緒會線上程佇列中等待 ewScheduledThread()建立一個定長的執行緒池,支援定時,週期性的執行任務 newSingleThreadExecutor(),建立一個單執行緒化的執行緒池,它只會用唯一的工作執行緒類執行任務,保證所有任務按照指定順序執行; newCacheThreadPool
<span style="font-family:KaiTi_GB2312;font-size:12px;">public class Main {
	public static void main( String[] args ) {

		ExecutorService executors = Executors.newCachedThreadPool();
		SleepTread mSleepTread;
		for ( int i = 0 ; i < 30 ; i++ ) {
			mSleepTread = new SleepTread();
			executors.execute(mSleepTread);
		}
		executors.shutdown();
	}

	static class SleepTread extends Thread {
		@Override
		public void run() {
			super.run();
			try {
				Thread.sleep(1500);
			} catch ( InterruptedException e ) {
				e.printStackTrace();
			}
			System.out.println(this.getName() + " ----- ");
		}
	}

}</span>
 這種執行緒池在一下加入多個任務的時候,長度會變得很大,會一直新建執行緒,當沒有任務時,空閒執行緒會被回收


newFixedThreadPool

<span style="font-family:KaiTi_GB2312;font-size:12px;">public static void main( String[] args ) {

		ExecutorService executors = Executors.newFixedThreadPool(3);
		SleepTread mSleepTread;
		for ( int i = 0 ; i < 30 ; i++ ) {
			mSleepTread = new SleepTread();
			executors.execute(mSleepTread);
		}
		executors.shutdown();
	}</span>

這個執行緒固定長度,

newScheduledThreadPool

<span style="font-family:KaiTi_GB2312;font-size:12px;">	public static void main( String[] args ) {

		ScheduledExecutorService executors = Executors.newScheduledThreadPool(5);
		SleepTread mSleepTread;
		for ( int i = 0 ; i < 30 ; i++ ) {
			mSleepTread = new SleepTread();
//			executors.execute(mSleepTread);
											//延遲多上時間執行,時間單位
			executors.schedule(mSleepTread, 3, TimeUnit.SECONDS);
		}
		executors.shutdown();
	}</span>
定時,或者迴圈執行的執行緒池,可定時,並不是execute執行,如果execute執行就沒有效果延遲效果,對應還有兩個方法,scheduleAtFixedRate(),和ScheduleWithFixedDelay(),第二個引數為任務執行完之後間隔下一個任務的停頓時間,第三個引數為最開始沒執行任務時的等待時間

newSingleThreadExecutor

<span style="font-family:KaiTi_GB2312;font-size:12px;">public static void main( String[] args ) {
		ExecutorService executors = Executors.newSingleThreadExecutor();
		SleepTread mSleepTread;
		for ( int i = 0 ; i < 30 ; i++ ) {
			mSleepTread = new SleepTread();
			executors.execute(mSleepTread);
		}
		executors.shutdown();
	}</span>
單例模式的執行緒池,同事只有一個任務在執行.還有單例可延遲的執行緒池ScheduleExecutorService
<span style="font-family:KaiTi_GB2312;font-size:12px;">	public static void main( String[] args ) {
		ScheduledExecutorService executors = Executors.newSingleThreadScheduledExecutor();
		SleepTread mSleepTread;
		for ( int i = 0 ; i < 30 ; i++ ) {
			mSleepTread = new SleepTread();
//			executors.execute(mSleepTread);
			executors.schedule(mSleepTread, 3, TimeUnit.SECONDS);
		}
		executors.shutdown();
	}</span>