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 核心池的大小 即使執行緒池中的執行緒都處於空閒狀態...