什么是線程池:
- 為了避免系統(tǒng)頻繁的創(chuàng)建和銷毀線程迹冤,我們可以讓創(chuàng)建的線程進行復用。在線程池中虎忌,總有那么幾個活躍線程泡徙,當你需要使用線程時,可以從池子中隨便拿一個空閑線程膜蠢,當你完成工作時堪藐,并不著急關(guān)閉線程,而是將這個線程退回到池子挑围,方便其他人使用礁竞。
java中的線程池是運用場景最多的并發(fā)框架,合理的使用線程池能夠帶來的3個好處:
- 第一:降低資源消耗贪惹;
- 第二:提高響應速度:
- 第三:提高線程的可管理性苏章;
為了更好的控制多線程,JDK提供了一套Executor框架奏瞬,幫助開發(fā)人員進行線程控制枫绅,其本質(zhì)就是一個線程池。
如圖:
這里寫圖片描述
- 以上成員均在java.util.concurrent包中硼端,是JDK并發(fā)包的核心類并淋。其中ThreadPoolExecutor表示一個線程池。Executors類扮演著線程池工廠的角色珍昨,通過Executors可以取得一個擁有特定功能的線程池县耽。
ThreadPoolExecutor類實現(xiàn)Executor接口,因此通過這個接口镣典,任何Runnable的對象都可以被ThreadPoolExecutor線程池調(diào)度兔毙。
Executor框架提供了各種類型的線程池,以下有四種常用的工廠方法:
- newFixedThreadPool()方法:該方法返回一個固定線程數(shù)量的線程池兄春。它適用于負載比較重的服務器澎剥。
- newSingleThreadExecutor()方法:該方法返回一個只有一個線程的線程池。適用于需要保證順序地執(zhí)行各個任務赶舆,并且在任意時間點哑姚,不會有多個線程是活動的應用場景。
- newCachedThreadPool()方法:該方法返回一個可根據(jù)實際情況調(diào)整線程數(shù)量的線程池芜茵。適用于執(zhí)行很多的短期異步任務的小程序叙量,或是負載較輕的服務器。
- newSingleThreadScheduledExecutor()方法:該方法返回一個ScheduledExecutorService對象九串,線程池大小為1.適用于需要單個后臺線程執(zhí)行周期任務绞佩,同時保證順序地執(zhí)行各個任務的應用場景。
線程池的使用:
- 通過ThreadPoolExecutor來創(chuàng)建一個線程池;
- 可以使用兩個方法向線程池提交任務:execute()和submit();
execute()方法用于提交不需要返回值的任務征炼;
submit()方法用于提交需要返回值的任務析既。 - 可以通過線程池的shutdown或shutdownNow方法來關(guān)閉線程池。
shutdownNow嘗試停止正在執(zhí)行或暫停任務的線程谆奥;
shutdown只是將線程池的狀態(tài)設(shè)置為SHUTDOWN狀態(tài)眼坏,然后中斷所有沒有正在執(zhí)行任務的線程。
以下通過一段代碼來展示線程池的應用:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadPoolTest {
public static void main(String[] args) {
ExecutorService threadPool = Executors.newFixedThreadPool(3);
for(int i=1;i<=10;i++) {
final int task = i;
threadPool.execute(new Runnable() {
@Override
public void run() {
for(int j=1;j<=10;j++) {
try {
Thread.sleep(20);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"loop of" +j +"for task of"+ task);
}
}
});
}
System.out.println("game over");
threadPool.shutdown();
}
}
以上就是一個簡單的小實例酸些,非常適合新手學習線程池宰译,其實線程池的實例還有好多,想多了解的可以在網(wǎng)上找到一大堆的資料以及源碼魄懂,這里菲菲同學就不舉例了沿侈,(因為我有好多點都不太懂呢,學習完全處于懵懂狀態(tài))我知道現(xiàn)在我寫的東西特別的膚淺市栗,如果大神們看到覺得特別幼稚的話缀拭,千萬不要打擊我哦。我會一步一步改進這些東西的填帽。