Java之線程池的簡單介紹

2020-12-25 彼岸end

各位小夥伴們大家好,這次小編要簡單介紹一下Java中的線程池。在之前小編介紹線程的時候,如果我們使用線程的時候,就可以去創建一個線程,那樣實現起來就非常簡單,但是如果並發地線程數量很多,並且每一個線程都是執行一個時間很短的任務就結束了,這樣頻繁創建線程就會大大降低系統的效率,頻繁創建和銷毀線程需要時間

通過使用線程池,可以使線程復用,就是執行完一個任務,不銷毀,繼續執行其他任務。

其實線程池就相當於一個容器(集合),裡面有很多線程。當程序第一次啟用的時候,創建多個線程,保存到一個集合中,當我們使用線程的時候,就可以從容器中取出線程使用,如:

Thread t=list.remove(0);remove返回的是被移除的元素(線程只能被一個任務使用)

Thread t=linked.removeFirst();

當使用完畢線程,需要把線程歸還給線程池

list.add(t);

linked.addLast(t);

線程池原理圖解

其實線程池就是一個容納多線程的容器,其中線程可以反覆使用,省去了創建線程對象的操作,無需反覆創建線程而消耗過多資源。就像上面這張圖中,線程1執行任務1,線程2執行任務2......但任務4沒有對應的線程,這時候我們沒有必要創建新的線程,只需要等待其它任務執行完,將線程歸還到線程池中然後調用線程就可以了

這樣的話,可以降低資源消耗,減少了創建和銷毀線程的次數,每一個線程都可以被重複利用。也可以提高響應速度,當任務到達時,任務不需要等到新線程創建就能立即執行

現在小編來說說線程池的代碼實現:

首先,java.util.concurrent.Executors:線程池的工廠類,用來生成線程池

其次,Executors類中的靜態方法

static ExecutorService newFixedThreadPool(int nThreads)創建一個可重用固定線程數的線程池

參數:

int nThreads:創建線程池中包含的線程數量

返回值:

ExecutorService接口,返回的是ExecutorService接口的實現類對象,我們可以使用ExecutorService接口接收(面向接口編程)

java.util.concurrent.ExecutorService:線程池接口,用來從線程池中獲取線程,調用start方法,執行線程任務。

submit(Runnable task)提交一個Runnable任務用於執行

關閉/銷毀線程池方法

void shutdown()

線程池的使用步驟

使用線程池的工廠類Executors裡面提供的靜態方法newFixedThreadPool生產一個指定線程數量的線程池。創建一個類,實現Runnable接口,重寫run方法,設置線程任務。調用ExecutorService中的方法submit,傳遞線程任務,開啟線程,執行run方法。調用ExecutorService中的方法shutdown銷毀線程池(不建議執行)。代碼如下:

//2.創建一個類,實現Runnable接口,重寫run方法,設置線程任務

public classRunnableImp1 implements Runnable {

public void run() {

System.out.println(Thread.currentThread().getName()+"創建了一個新的線程,執行");

}

}

創建Demo01ThreadPool類

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

public class Demo01ThreadPool {

public static void main(String args[]) {

/*1.使用線程池的工廠類Executors裡面提供的靜態方法newFixedThreadPool生產一個指定線程數量的線程池。*/

ExecutorService es=Executors.newFixedThreadPool(2);//線程池數量為2

//3.調用ExecutorService中的方法submit,傳遞線程任務,開啟線程,執行run方法。

es.submit(new RunnableImp1());

es.submit(new RunnableImp1());

es.submit(new RunnableImp1());

//4.調用ExecutorService中的方法shutdown銷毀線程池(不建議執行)

es.shutdown();//使用後會把線程池銷毀,就無法執行新的線程了

}

}

關於線程池的原理,還有線程池代碼的創建,小編就先說到這裡,希望這篇文章可以幫到大家,也歡迎各位小夥伴補充和糾錯

圖片來自網絡,如有侵權,請聯繫作者刪除

相關焦點

  • Java中線程池的簡單使用
    線程池可以用來幹什麼?線程池就可以幫助我們解決這個問題,他使線程可以重複使用,就是執行完一個任務線程不會被銷毀,而是可以繼續執行其他任務java中的線程池如何使用?java中線程池的使用java中有哪些線程池Java通過Executors提供四種線程池,分別為:
  • 【線程池】java線程池ThreadPoolExecutor
    可選的參數為java.util.concurrent.TimeUnit中的幾個靜態屬性:NANOSECONDS、MICROSECONDS、MILLISECONDS、SECONDS。    workQueue 存放通過execute方法提交給線程等待執行的任務的隊列。    threadFactory 負責給線程池創建線程的工廠。
  • java開發之Tomcat線程池優化
    前言:上期我們說到了jvm的內存優化,這期我們來說說tomcat的線程池優化,此思路同樣可用於c3p0等連接池tomcat線程池優化我們tomcat線程池的優化,其實就是最大限度的發揮tomcat的性能。即讓伺服器在保障性能的情況下並發最大並發:所有線程,在同一秒一起訪問同一個資源。
  • Java中線程池,你真的會用嗎?
    線程池的實現原理》這篇文章中,我們介紹過了Java中線程池的常見用法以及基本原理。到底應該如何創建一個線程池呢?Executors 是一個Java中的工具類。提供工廠方法來創建不同類型的線程池。從上圖中也可以看出,Executors的創建線程池的方法,創建出來的線程池都實現了ExecutorService接口。常用方法有以下幾個:newFiexedThreadPool(int Threads):創建固定數目線程的線程池。
  • 深入理解 Java 線程池!
    這種問題使用線程池便可以很好的解決。通過線程池線程,銷毀及回收等交由線程池進行管理,就可以避免以上的問題。構造函數的參數中大部分都很簡單,只有參數workQueue和handler需要進行詳細說明,下面對這兩個參數進行詳細的說明:參數workQueue指被提交但未執行的任務隊列,它是一個BlockingQueue接口的對象,僅用於存放Runnable對象,根據隊列功能分類,在ThreadPoolExecutor類的構造函數中可以使用以下幾種BlockingQueue接口。
  • Java入門 - - - 線程池的基本使用
    線程池背景介紹舉例說明:假設,目前有1000(或者更多)個任務需要執行,傳統方法可能需要利用循環創建1000個線程分別執行這1000個任務。線程池基本使用1.創建線程:java.uitl.concurrent.ThreadPoolExecutor類是線程池中最核心的一個類,因此如果要透徹地了解Java中的線程池,必須先了解這個類。在ThreadPoolExecutor類中提供了四個構造方法:
  • 手寫Java線程池(超詳細解說)
    ), 因為線程池自身執行也需要一個線程, 所以繼承Thread, 這樣可以在BasicThreadPool的構造方法中執行start(), run方法中執行創建線程的操作(線程池內部執行任務的線程); 創建線程取決於線程池設置的最大線程數, 核心線程數, 初始化線程數, 用戶提交的任務數;2.實現ThreadPool接口(該接口主要用於定義線程池的基本操作, 比如執行任務, 獲取線程池的一些基本屬性
  • java新手揭秘:阿里巴巴為何禁止使用Executors來創建線程池
    當一個java新手從不斷地Curd階段跳出來之後,就會學習java的並發,並行等高階用法,自然就會用到線程、線程池,線程池的好處這裡就不做詳細解釋,你應該會學習到Executors創建線程池的四個方法, 分別是:newFixedThreadPool
  • java線程池核心類ThreadPoolExecutor概述
    JAVA中的阻塞隊列和非阻塞隊列我們介紹了常用的幾種隊列,隊列的使用很廣泛,特別是一些需要生產消費模式的場景以及需要對全局的集合進行操作的場景。我們使用線程池來解決這個問題,讓線程運行完不立即銷毀,並且重複使用,繼續執行其他的任務。使用線程池來管理線程,一方面使線程的創建更加規範,可以合理控制開闢線程的數量;另一方面線程的細節管理交給線程池處理,優化了資源的開銷。
  • Java線程池其實看懂了也很簡單
    當線程池中的線程數剛好達到 maximumPoolSize 這個值的時候,這個任務能否正常被執行?......,想要了解這些問題的答案我們只能在線程池的源碼中尋找了。為什麼需要 double check 線程池的狀態?在多線程環境下,線程池的狀態時刻在變化,而 ctl.get() 是非原子操作,很有可能剛獲取了線程池狀態後線程池狀態就改變了。判斷是否將 command 加入 workque 是線程池之前的狀態。
  • Java並發編程系列34|深入理解線程池(下)
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫本文是深入理解線程池下篇:線程池介紹Executor框架接口線程池狀態線程池參數線程池創建執行過程關閉線程池其他問題任務拒絕策略線程池中的線程初始化線程池容量的動態調整線程池的監控6.
  • java開發基礎 線程池詳解
    前言:我們在開發中經常用會到多線程,今天來介紹一下線程池的使用。線程池簡介1.5以後引入了Executor框架,它的內部使用了線程池機制,我們常使用這個框架來創建線程池。-newFixedThreadPool先查看池中有沒有以前建立的線程,如果有,就 reuse.如果沒有就建一個新的線程加入池中-其獨特之處:任意時間點,最多只能有固定數目的活動線程存在,此時如果有新的線程要建立,只能放在另外的隊列中等待,直到當前的線程中某個線程終止直接被移出池子-和cacheThreadPool不同,FixedThreadPool沒有IDLE
  • 深入理解 Java 線程池,講解的太清晰了
    核心 API 概述Executor 框架核心 API 如下:Executor - 運行任務的簡單接口。ExecutorService - 擴展了 Executor 接口。三、ThreadPoolExecutorjava.uitl.concurrent.ThreadPoolExecutor 類是 Executor 框架中最核心的類。所以,本文將著重講述一下這個類。
  • 「原創」Java並發編程系列33|深入理解線程池(上)
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫並發編程必不可少的線程池,接下來分兩篇文章介紹線程池,本文是第一篇。線程池將介紹如下內容:線程池介紹Executor框架接口線程池狀態線程池參數線程池創建
  • 七個方面帶你玩轉Java線程池
    而這些離不開對線程池原理的深入了解。  本篇文章會從線程池的分類、線程池的創建、向線程池提交任務、關閉線程池、配置線程池、線程池的監控、線程池的實現原理七個方面講解線程池。從代碼var1、var2、var3我們看不出所指代的內容,所以我們看下文檔:  https://developer.android.google.cn/reference/java/util/concurrent/ThreadPoolExecutor
  • 通過源碼解析,深入Java 線程池原理
    簡單來說,池化技術就是通過復用來提升性能。線程、內存、資料庫的連接對象都是資源,在程序中,當你創建一個線程或者在堆上申請一塊內存的時候都涉及到很多的系統調用,也是非常消耗CPU的。如果你的程序需要很多類似的工作線程或者需要頻繁地申請釋放小塊內存,在沒有對這方面進行優化的情況下,這部分代碼很可能會成為影響你整個程序性能的瓶頸。
  • Java中的線程池實現原理
    Java中的線程池實現原理上文從自定義一個線程池Java線程池,簡單說了線程的實現原理,本文就從Java實現的線程池說說線程池的原理。線程池的實現原理首先創建一個線程池,當添加一個新的任務的時候,線程池的處理流程。
  • Java線程池詳解及常用方法
    這篇將介紹一下線程池的基本使用。ExecutorsExecutors是concurrent包下的一個類,為我們提供了創建線程池的簡便方法。Executors可以創建我們常用的四種線程池:(1)newCachedThreadPool 創建一個可緩存線程池,如果線程池長度超過處理需要,可靈活回收空閒線程,若無可回收,則新建線程。不設上限,提交的任務將立即執行。
  • java線程池源碼白話分析
    1.計算機的基礎知識2.ThreadPoolExecutor簡單示例3.ThreadPoolExecutor屬性分析4.ThreadPoolExecutor構造方法分析5.線程池創建線程順序分析addWorker在執行過程中,會根據線程池狀態和線程池數量判斷是否能創建線程,創建線程成功會將記錄線程池狀態和數量的ctl值+1,並將worker加入到workers裡面,更新線程池生命周期內線程池線程的最大數量,然後啟動線程執行任務。
  • 使用Executors,ThreadPoolExecutor,創建線程池,源碼分析理解
    TestThreadPoolExecutor 示例TestThreadPoolExecutor.javapackage io.ymq.thread.TestThreadPoolExecutor;import java.util.concurrent.ArrayBlockingQueue;import java.util.concurrent.ThreadPoolExecutor