使用執行緒和執行緒池

2022-09-12 19:39:17 字數 2579 閱讀 5105

1、new thread的弊端

執行乙個非同步任務你還只是如下new thread嗎?

new thread(new runnable() 

}).start();

那你就out太多了,new thread的弊端如下:

a. 每次new thread新建物件效能差。

b. 執行緒缺乏統一管理,可能無限制新建執行緒,相互之間競爭,及可能占用過多系統資源導致宕機或oom。

c. 缺乏更多功能,如定時執行、定期執行、執行緒中斷。

相比new thread,j**a提供的四種執行緒池的好處在於:

a. 重用存在的執行緒,減少物件建立、消亡的開銷,效能佳。

b. 可有效控制最大併發執行緒數,提高系統資源的使用率,同時避免過多資源競爭,避免堵塞。

c. 提供定時執行、定期執行、單執行緒、併發數控制等功能。

2、j**a 執行緒池

j**a通過executors提供四種執行緒池,分別為:

newcachedthreadpool建立乙個可快取執行緒池,如果執行緒池長度超過處理需要,可靈活**空閒執行緒,若無可**,則新建執行緒。

newfixedthreadpool 建立乙個定長線程池,可控制線程最大併發數,超出的執行緒會在佇列中等待。

newscheduledthreadpool 建立乙個定長線程池,支援定時及週期性任務執行。

newsinglethreadexecutor 建立乙個單執行緒化的執行緒池,它只會用唯一的工作執行緒來執行任務,保證所有任務按照指定順序(fifo, lifo, 優先順序)執行。

(1). newcachedthreadpool

建立乙個可快取執行緒池,如果執行緒池長度超過處理需要,可靈活**空閒執行緒,若無可**,則新建執行緒。示例**如下:

//執行緒池為無限大,當執行第二個任務時第乙個任務已經完成,會復用執行第乙個任務的執行緒,而不用每次新建執行緒。

executorservice cachedthreadpool = executors.newcachedthreadpool();

for (int i = 0; i < 10; i++) catch (interruptedexception e)

cachedthreadpool.execute(new runnable()

});}

(2). newfixedthreadpool

建立乙個定長線程池,可控制線程最大併發數,超出的執行緒會在佇列中等待。示例**如下:

//因為執行緒池大小為3,每個任務輸出index後sleep 2秒,所以每兩秒列印3個數字。

//定長線程池的大小最好根據系統資源進行設定。如runtime.getruntime().**ailableprocessors()。可參//考//preloaddatacache。

executorservice fixedthreadpool = executors.newfixedthreadpool(3);

for (int i = 0; i < 10; i++) catch (interruptedexception e)

}});

}

(3) newscheduledthreadpool

建立乙個定長線程池,支援定時及週期性任務執行。表示延遲3秒執行。延遲執行示例**如下:

scheduledexecutorservice scheduledthreadpool = executors.newscheduledthreadpool(5);

scheduledthreadpool.schedule(new runnable()

}, 3, timeunit.seconds);

定期執行示例**如下:

scheduledthreadpool.scheduleatfixedrate(new runnable() 

}, 1, 3, timeunit.seconds);

表示延遲1秒後每3秒執行一次。

scheduledexecutorservice比timer更安全,功能更強大

(4)、newsinglethreadexecutor

建立乙個單執行緒化的執行緒池,它只會用唯一的工作執行緒來執行任務,保證所有任務按照指定順序(fifo, lifo, 優先順序)執行。示例**如下:

executorservice singlethreadexecutor = executors.newsinglethreadexecutor();

for (int i = 0; i < 10; i++) catch (interruptedexception e)

}});

}

結果依次輸出,相當於順序執行各個任務。

現行大多數gui程式都是單執行緒的。android中單執行緒可用於資料庫操作,檔案操作,應用批量安裝,應用批量刪除等不適合併發但可能io阻塞性及影響ui執行緒響應的操作。

JDK執行緒池和Spring執行緒池的使用

jd 程池和spring執行緒池例項,非同步呼叫,可以直接使用 1 jd 程池的使用,此處採用單例的方式提供,見示例 public class threadpoolutil public static executorservice getexecutorservice 在其它地方可以直接這樣使用 ...

什麼是執行緒池?執行緒池的工作原理和使用執行緒池的好處

乙個執行緒池管理了一組工作執行緒,同時它還包括了乙個用於放置等待執行任務的任務佇列 阻塞佇列 預設情況下,在建立了執行緒池後,執行緒池中的執行緒數為0.當任務提交給執行緒池之後的處理策略如下 1 如果此時執行緒池中的數量小於corepoolsize 核心池的大小 即使執行緒池中的執行緒都處於空閒狀態...

什麼是執行緒池?執行緒池的工作原理和使用執行緒池的好處

乙個執行緒池管理了一組工作執行緒,同時它還包括了乙個用於放置等待執行任務的任務佇列 阻塞佇列 預設情況下,在建立了執行緒池後,執行緒池中的執行緒數為0.當任務提交給執行緒池之後的處理策略如下 1 如果此時執行緒池中的數量小於corepoolsize 核心池的大小 即使執行緒池中的執行緒都處於空閒狀態...